您应该能够通过将 PFX 文件作为 X509Certificate2Collection 对象打开来遍历 PFX 中的证书(并将每个证书导入您选择的证书存储区)。
以下是 X509Certificate2Collection 上的文档:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2collection.aspx
MSDN 在该文档页面中提供了一些示例代码,说明如何检查集合中的每个证书。
一旦您了解了有关每个证书的 CN/颁发者/其他信息,就应该清楚每个证书需要添加到哪个证书存储区。为此,您可以使用 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 问题的回答:
如何使用 c# 从 pfx 文件中检索证书?
正如对该答案的最新评论之一所述,当您尝试将证书导入当前用户的根存储(“StoreName.Root”和“StoreLocation.CurrentUser”作为名称/位置)时,您将收到一个弹出对话框询问你去确认。
为了解决这个问题,我刚刚在我的证书导入方法中添加了一点 MS UI 自动化代码,在提示符上单击“确定”。
或者,正如评论者“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
}