Подтвердить что ты не робот

Как получить сертификаты из файла pfx с помощью С#?

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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, корневого ЦС) вам нужно будет открыть соответствующий хранилище сертификатов (как объект X509Store), чтобы импортировать его.

Проверьте X509Store docs:

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.