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()); 
} 
相關問題