2011-10-10 175 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