2011-10-10 33 views
7

我們使用C#代碼我們用.p12文件構建X509Certificate2,在構造函數中我們插入證書路徑,證書的密碼。我們也將其標記爲可導出如下圖所示:從X509Certificate對象導出私鑰

X509Certificate2 x509Certificate2 = new X509Certificate2 
("...\\MyCerificate.p12", "[email protected]", X509KeyStorageFlags.Exportable); 

我們通過以下獲得私鑰AsymmetricAlgorithm格式:

x509Certificate2.PrivateKey 

現在,我們想從該證書作爲私鑰Base64格式 - 但我們不知道如何去做,對我們來說這非常重要。

+0

你打算如何使用Base64輸出?這是嚴格的需要還是偏好? –

回答

2

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

rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 

之後,你應該能夠得到RSA密鑰信息,從它的ExportParameters財產。

+0

當我們知道密鑰信息(例如RSA-PKCS1-KeyEx)時,我們如何將私鑰轉換爲base64? – RRR

-3

如果你的唯一的問題是讓私鑰Base64編碼,你可以簡單地這樣做:

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

privateKey.ToString()返回「System.Security.Cryptography.RSACryptoserviceProvider」.....,這不是私鑰... – RRR

+0

@RRR是正確的。你會發現x509Certificate2.PublicKey.Key.ToString()將以這種方式返回*相同的*值。這不可能是正確的:) – rdev5

3

重要的問題是,爲什麼的base64

如果這是針對您自己的應用程序,那麼您可以將私鑰保存爲XML字符串(非常容易:-)。

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

如果你想的base64(再次只爲你的應用程序),您可以導出密鑰(RSAParameters),那麼每CONCAT和byte[]把合併後的輸出到Base64字符串。

但是如果你想用一個需要的base64私鑰,那麼你需要知道的格式(在的base64字符串內)其它應用程序互操作。例如。在許多情況下,私鑰是編碼的PEM(其是具有特殊頁眉/頁腳的base64,對於X509Certificate,請參見example)。

如果你正在尋找什麼,那麼你需要首先在PKCS#8結構中編碼私鑰,然後轉入base64並添加頁眉/頁腳。您可以找到一些有用的代碼來執行此操作inside Mono.Security.dll(來自Mono項目的MIT.X11授權代碼)。

+0

我依賴於需要獲得base64私鑰的其他應用程序。我想允許用戶插入X509Certificate2並且自己將私鑰提取爲基本64格式 - 你知道.Net框架是否公開了任何方式來執行它? – RRR

+0

不,如果它(我真的懷疑),或者如果我知道我會將它列入我的答案。這就是說你的問題依然存在,它不是一個** base64 **問題,它知道**裏面的**對於與其他應用程序進行交互非常重要。 – poupou