![](/img/trans.png)
[英]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.