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

Max*_*xim 7 c# ssl ssl-certificate x509certificate .net-standard

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

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

bar*_*njs 9

使用框架类型无法实现此目的.有可能使用BouncyCastle或其他库.

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

X509Certificate2 mergedCert = cert.CopyWithPrivateKey(rsaPrivateKey);
X509Certificate2 mergedCert = cert.CopyWithPrivateKey(dsaPrivateKey);
X509Certificate2 mergedCert = cert.CopyWithPrivateKey(ecdsaPrivateKey);
Run Code Online (Sandbox Code Playgroud)

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

该框架类型也没有加载关键对象从二进制表示的方式(有例外CngKey.Import,但仅适用于Windows),只能从预解析结构(RSAParameters,DSAParameters,ECParameters).

在Linux上实现这一目标的最简单方法(如果BouncyCastle无法帮助你)是System.Process用来产生类似的调用openssl pkcs12 -export -out tmp.pfx -in tmp.cer -inkey tmp.key -password pass:"".

在Windows上,您可以使用CngKey.Import和P/Invoke CertSetCertificateContextProperty(对于CERT_NCRYPT_KEY_HANDLE_PROP_ID(78))然后调用cert.Export变异的证书.