2016-09-19 51 views
2

我有大量的单个证书存储为.p12扩展名的文件。我想将所有这些证书合并到一个.pfx文件中,以减少在客户端计算机上导入所有这些证书的工作量。 这是我试过的。它创建该文件,但是当我导入.pfx文件时会发生问题。 Windows证书导入向导只导入第一个证书并在此之后忽略所有内容。我想是因为有什么错误与我试图将它们组合方式的文件原因格式。我不确定这样做的正确方法。有任何想法吗?如何将多个.p12证书合并到一个.pfx文件中

private void btnCombineCerts_Click(object sender, EventArgs e) 
{ 
    String dateString = DateTime.Now.ToString("yyyyMMdd"); 
    String timeString = DateTime.Now.ToString("hhmmssff"); 
    String path = Directory.GetCurrentDirectory() + @"\certs\CombinedCerts\"; 
    if (!Directory.Exists(path)) 
    { 
     Directory.CreateDirectory(path); 
    } 
    List<X509Certificate2> certs = new List<X509Certificate2>(); 
    foreach(var certFile in fDialog.FileNames) 
    { 
     X509Certificate2 cert = new X509Certificate2(certFile); 
     certs.Add(cert); 
    } 
    foreach(X509Certificate2 cert in certs) 
    {     
     byte[] certStream = cert.Export(X509ContentType.Pfx); 
     using (var stream = new FileStream(path + dateString + "CombinedCerts" + timeString + ".pfx", FileMode.Append)) 
     { 
      stream.Write(certStream, 0, certStream.Length); 
     } 

    } 
} 

回答

2

PFX固有地支持多个证书,但它不像您写的那样是一个顺序文件。我不知道UI会正确导入,但如果每件东西都有私钥,它可能会导致这种情况。在一个真正的使用X509Certificate2Collection的是,它可以导出或导入。

var certs = new X509Certificate2Collection(); 

foreach (var certFile in fDialog.FileNames) 
{ 
    certs.Add(new X509Certificate2(certFile)); 
} 

byte[] oneBigPfx = certs.Export(X509ContentType.Pfx); 
File.WriteAllBytes(filename, oneBigPfx); 
+0

这完美的作品。谢谢。我也会提到Export方法需要一个密码参数,这是额外的好处。 – smitty1

相关问题