簡體   English   中英

從X509Certificate對象導出私鑰

[英]Export private key from X509Certificate object

我們使用C#代碼,並使用.p12文件構建X509Certificate2,在構造函數中,我們插入證書的路徑,證書的密碼。 我們還將其標記為“可導出”,如下所示:

X509Certificate2 x509Certificate2 = new X509Certificate2
("...\\MyCerificate.p12", "P@ssw0rd", X509KeyStorageFlags.Exportable);

我們通過以下方式將私鑰獲取為AsymmetricAlgorithm格式:

x509Certificate2.PrivateKey

現在,我們希望以Base64格式從證書中獲取私鑰-但是我們不知道如何做,這對我們來說是如此重要。

重要的問題是為什么選擇base64

如果這是針對您自己的應用程序,則可以將私鑰保留為XML字符串(更容易::)。

string xml = x509Certificate2.PrivateKey.ToXmlString (true);

如果要使用base64 (再次用於您的應用程序),則可以導出密鑰(RSAParameters),然后連接每個byte[] ,然后將合並的輸出轉換為base64字符串。

但是,如果要與需要base64私鑰的其他應用程序互操作,則需要知道格式(在base64字符串中)。 例如,在許多情況下,私鑰是PEM編碼的(它是具有特殊頁眉/頁腳的base64,請參見X509Certificate示例 )。

如果您要查找的是什么,那么您首先需要在PKCS#8結構內對私鑰進行編碼,然后轉到base64並添加頁眉/頁腳。 您可以 Mono.Security.dll中找到一些有用的代碼(來自Mono項目的MIT.X11許可代碼)。

您可以簡單地使用X509Certificate2的PrivateKey屬性。 實際返回的私鑰實現取決於證書中使用的算法-通常是RSA:

rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 

之后,您應該能夠從它的ExportParameters屬性中獲取RSA密鑰信息。

您可以使用.NET的OpenSSL庫來實現:

using DidiSoft.OpenSsl;
...
X509Certificate2 x509Certificate2 = new X509Certificate2
("...\\MyCerificate.p12", "P@ssw0rd", X509KeyStorageFlags.Exportable);

PrivateKey privKey = PrivateKey.Load(x509Certificate2.PrivateKey);
bool withNewLines = true;
string base64PrivateKey = privKey.ToBase64String(withNewLines);

如果您唯一的問題是對私有密鑰Base64進行編碼,則可以像這樣簡單地進行操作:

var privateKey = x509Certificate2.PrivateKey;
var encoding = new System.Text.ASCIIEncoding();
var base64String = Convert.ToBase64String(encoding.GetBytes(privateKey.ToString()));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM