Вы должны иметь возможность перебирать сертификаты в вашем PFX (и импортировать каждый из них в хранилище сертификатов по вашему выбору), открывая файл PFX как объект X509Certificate2Collection.
Вот документы по X509Certificate2Collection:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2collection.aspx
MSDN предоставляет пример кода на этой странице документации о том, как проверять каждый сертификат в коллекции.
Как только вы знаете CNs / Issuers / другую информациюо каждом сертификате должно быть ясно, к какому хранилищу сертификатов нужно добавить каждый сертификат.Для этого вы можете использовать класс X509Store и перечисление StoreName, чтобы указать, в какое хранилище вы хотите открыть / добавить:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store.aspx
http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.storename.aspx
См. Такжемой ответ на аналогичный вопрос SO:
Как получить сертификаты из файла pfx с помощью c #?
Как упоминалось в одном из последних комментариев к этому ответу, когдапри попытке импортировать сертификат в корневое хранилище текущего пользователя («StoreName.Root» и «StoreLocation.CurrentUser» в качестве имени / местоположения) вы получите всплывающее диалоговое окно с просьбой подтвердить.
Чтобы решить эту проблемуЯ просто добавил немного кода MS UI Automation в свой метод импорта сертификатов, чтобы щелкнуть OK в приглашении.
Или, как говорит комментатор «CodeWarrior» в комментарии к другому ответу SO, чтобы избежать всплывающего диалогового окна, которое выможно попробовать поместить корневой сертификат в хранилище LocalMachine вместо CurrentUser.
Пример кода:
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 certificate into an X509Store object
}