有没有办法将证书和密钥(两者都作为Base64字符串从服务中单独接收)组合成一个.pfx文件,使用C#/。NET标准以编程方式?使用工具不是一种选择,因为我需要自动化它。
上下文:我需要将证书和私钥(不带页眉和页脚的单独Base64字符串)加载到X509Certificate2
对象,以便从.NET Standard 1.6库将其传递给应用程序。
问题是,.NET Standard中的PrivateKey
类中没有X509Certificate2
属性!所以我在X509Certificate2
对象中实际加载私钥的唯一方法是将它与证书本身组合在一个.pfx文件中,并在构造函数中加载它。
答案 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 }},RSAParameters
,DSAParameters
)。
在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:""
。