c# - 如何将多个 .p12 证书合并为一个 .pfx 文件

标签 c# certificate x509certificate2

我有大量的单一证书存储为扩展名为 .p12 的文件。我想将所有这些证书合并到一个 .pfx 文件中,以减少在客户端计算机上导入所有这些证书的工作量。 这是我试过的。它会创建文件,但在我导入 .pfx 文件时会出现问题。 Windows 证书导入向导只导入第一个证书并忽略之后的所有内容。我假设是因为我尝试组合它们的方式导致文件格式有问题。我不确定执行此操作的正确方法。有任何想法吗?

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);
        }

    }
}

最佳答案

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);

关于c# - 如何将多个 .p12 证书合并为一个 .pfx 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39564650/

相关文章:

c# - 对 SSPI 的调用失败,第二次运行调用时是否看到内部异常?

c# - Azure:通过证书从云工作人员连接到 key 保管库

c# - X509Certificate 构造函数需要 >6 秒才能为特定用户执行

c# - 为什么需要typeof?

c# - 从字符串位转换为字节或十六进制

java - 如何在单个命令中使用 keytool 在 java 中导入和信任网络服务器证书?

xml - 为 SAML 签名和加密创建 x509.v3 自签名证书,Windows 8 R2

c# - 如何获取打开的资源管理器窗口的 PIDL?

c# - SomeButNotAll() 是否有优雅的 LINQ 解决方案?

macos - OSX 10.10 无需密码即可导入 .pfx?