.NET Standard - 以编程方式将证书和私钥合并到.pfx文件中

时间:2017-06-09 19:40:54

标签: c# ssl ssl-certificate x509certificate .net-standard

有没有办法将证书和密钥(两者都作为Base64字符串从服务中单独接收)组合成一个.pfx文件,使用C#/。NET标准以编程方式?使用工具不是一种选择,因为我需要自动化它。

上下文:我需要将证书和私钥(不带页眉和页脚的单独Base64字符串)加载到X509Certificate2对象,以便从.NET Standard 1.6库将其传递给应用程序。 问题是,.NET Standard中的PrivateKey类中没有X509Certificate2属性!所以我在X509Certificate2对象中实际加载私钥的唯一方法是将它与证书本身组合在一个.pfx文件中,并在构造函数中加载它。

1 个答案:

答案 0 :(得分:8)

使用框架类型无法做到这一点。有可能使用BouncyCastle或其他库。

.NET Core 2.0添加了通过扩展方法将证书和密钥对象合并在一起(到新的X509Certificate2对象中)的功能:

X509Certificate2 mergedCert = cert.CopyWithPrivateKey(rsaPrivateKey);
X509Certificate2 mergedCert = cert.CopyWithPrivateKey(dsaPrivateKey);
X509Certificate2 mergedCert = cert.CopyWithPrivateKey(ecdsaPrivateKey);

但这需要专门针对netcoreapp20进行编译(而不是netstandard20)。

框架类型也没有办法从二进制表示中加载关键对象(CngKey.Import除外,但仅适用于Windows),只能从预解析的结构中加载{{1 }},RSAParametersDSAParameters)。

在Linux上实现此目标的最简单方法(如果BouncyCastle无法帮助您)是使用ECParameters生成类似于System.Process的调用。

在Windows上,您可以使用CngKey.Import和P / Invoke CertSetCertificateContextProperty(对于CERT_NCRYPT_KEY_HANDLE_PROP_ID(78))然后在变异的证书上调用openssl pkcs12 -export -out tmp.pfx -in tmp.cer -inkey tmp.key -password pass:""