Как получить сертификаты из файла pfx с помощью c #? - PullRequest
25 голосов
/ 18 февраля 2011

Я полдня гуглил в поисках способа прочитать файл .pfx и импортировать сертификаты в certstore .

Пока что я могу прочитать файл .pfx с X509Certifcate и импортировать один сертификат в файл .pfx. Пока все хорошо, но в файле .pfx есть три сертификата, и при загрузке .pfx с X509Certificate я не могу увидеть другие два сертификата.

Сертификат был экспортирован с

* Обмен персональной информацией - PKCS # 12 (.PFX)

  • Включите все сертификаты в путь сертификации, если это возможно

  • Включить надежную защиту (требуется IE 5.0, NT 4.0 SP4 или выше)

Это параметры, выбранные при экспорте сертификата (ов). Я знаю, что есть три сертификата, потому что я вручную захожу в certstore (MMC) и импортирую его в личную папку.

1 Ответ

44 голосов
/ 18 февраля 2011

Вы можете получить объект коллекции, содержащий сертификаты в вашем файле .pfx , используя класс X509Certificate2Collection ... вот пример кода на C #:

string certPath = <YOUR PFX FILE PATH>;
string certPass = <YOUR PASSWORD>;

// Create a collection object and populate it using the PFX file
X509Certificate2Collection collection = new X509Certificate2Collection();
collection.Import(certPath, certPass, X509KeyStorageFlags.PersistKeySet);

Затем вы можете перебрать коллекцию:

foreach (X509Certificate2 cert in collection)
{
    Console.WriteLine("Subject is: '{0}'", cert.Subject);
    Console.WriteLine("Issuer is:  '{0}'", cert.Issuer);

    // Import the certificates into X509Store objects
}

В зависимости от типа сертификата (клиентский сертификат, промежуточный сертификат CA, корневой CA) вам потребуется открыть соответствующее хранилище сертификатов (как объект X509Store) для его импорта.

Проверьте X509Store документы:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store.aspx

И различные члены в перечислении StoreName:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.storename.aspx

Насколько я понимаю, вы хотите использовать StoreName.My для клиентских сертификатов, которые содержат закрытый ключ, StoreName.CertificateAuthority для промежуточных сертификатов CA и StoreName.Root для корневых сертификатов CA.

...