[英]How can I convert a BouncyCastle X509Certificate to an X509Certificate2?
[英]How to convert BouncyCastle X509Certificate to .NET Standard X509Certificate2 while retaining the private key?
我需要将生成的 BouncyCastle X509Certificate
转换为X509Certificate2
,并将私钥加载到生成的.NET Standard X509Certificate2
对象中。 这可能吗?
有一个类似问题的答案https://stackoverflow.com/a/8150799/5048935 ,但在生成 BouncyCastle 证书并将其转换为 .NET X509Certificate2
,结果对象的HasPrivateKey
属性设置为“false”。
我需要将证书和私钥(没有页眉和页脚的单独 Base64 字符串)加载到X509Certificate2
对象,以将其从 .NET Standard 1.6 库传递给应用程序。 问题是, .NET Standard 中的X509Certificate2
类中没有PrivateKey
属性! 因此,我在X509Certificate2
对象中实际加载私钥的唯一方法是将它与证书本身结合在一个 .pfx 文件中,并像在构造函数中那样加载它。
我有使用 BouncyCastle 的建议( https://stackoverflow.com/a/44465965/5048935 ),所以我首先从 Base64 字符串生成一个 BouncyCastle X509Certificate
,然后尝试将其转换为X509Certificate2
同时保留私钥.
我发现的最好方法是通过内存中的 PFX 流。 假设您已经在bcCert
加载了 Bouncy Castle 证书。 注意:如果您要将 .NET X509Certificate2
保存在任何地方,则“别名”是稍后将在 UI 中调用的内容,否则它无关紧要(除了两个调用都需要相同之外)。
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Security;
using System.IO;
using System.Security.Cryptography.X509Certificates
var pkcs12Store = new Pkcs12Store();
var certEntry = new X509CertificateEntry(bcCert);
pkcs12Store.SetCertificateEntry(alias, certEntry);
pkcs12Store.SetKeyEntry(alias, new AsymmetricKeyEntry(certKey.Private), new[] { certEntry });
X509Certificate2 keyedCert;
using (MemoryStream pfxStream = new MemoryStream())
{
pkcs12Store.Save(pfxStream, null, new SecureRandom());
pfxStream.Seek(0, SeekOrigin.Begin);
keyedCert = new X509Certificate2(pfxStream.ToArray());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.