繁体   English   中英

如何在保留私钥的同时将 BouncyCastle X509Certificate 转换为 .NET Standard 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM