1

我需要将生成的BouncyCastle X509Certificate转换为X509Certificate2,并将私钥加载到生成的.NET标准X509Certificate2对象中。那可能吗?如何将BouncyCastle X509Certificate转换为.NET Standard X509Certificate2,同时保留私钥?

没有为一个类似的问题https://stackoverflow.com/a/8150799/5048935一个答案,但产生BouncyCastle的证书并将其转换到.NET X509Certificate2生成的对象具有其HasPrivateKey属性设置为“假”之后。

语境

我需要加载的证书和私有密钥(不页眉和页脚的Base64分开字符串)到X509Certificate2对象到它传给从.NET 1.6标准库中的应用程序。问题是,在.NET标准中的X509Certificate2类中没有PrivateKey属性!所以对我来说,将私钥真正加载到X509Certificate2对象中的唯一方法是将其与证书本身结合在.pfx文件中,并像构造函数中那样加载它。

我有建议使用BouncyCastle的了解(https://stackoverflow.com/a/44465965/5048935),所以我第一次产生从Base64编码字符串一个BouncyCastle的X509Certificate,然后尝试将其转换为X509Certificate2,同时保留私有密钥。

+0

你可以发布一些代码,以便我们可以看到你到目前为止? – tattarrattat

回答

4

我发现的最好方法是通过内存中的PFX流。假设你已经在“bcCert”中加载了你的充气城堡证书。注意:如果你打算在任何地方保存.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()); 
} 
相关问题