簡體   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