从X509Certificate对象导出私钥

问题描述 投票:8回答:4

我们使用C#代码我们用.p12文件构建X509Certificate2,在构造函数中我们插入证书的路径,证书的密码。我们还将其标记为可导出,如下所示:

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

我们通过以下方式获取私钥作为AsymmetricAlgorithm格式:

x509Certificate2.PrivateKey

现在,我们希望从证书中获取私钥作为Base64格式 - 但我们不知道如何做到这一点,它对我们如此重要。

c# certificate base64 private-key x509certificate2
4个回答
4
投票

重要的问题是为什么base64?

如果这是您自己的应用程序,那么您可以将私钥保持为XML字符串(更容易:-)。

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

如果你想要base64(同样只是你的应用程序)你可以导出密钥(RSAParameters)然后连接每个byte[]并将合并的输出转换为base64字符串。

但是如果你想与需要base64私钥的其他应用程序互操作,那么你需要知道格式(在base64字符串内)。例如。在许多情况下,私钥是PEM编码(具有特殊页眉/页脚的base64,参见exampleX509Certificate)。

如果您正在寻找什么,那么您首先需要在PKCS#8结构中对私钥进行编码,然后将其转入base64并添加页眉/页脚。您可以找到一些有用的代码来执行此操作inside Mono.Security.dll(MIT.X11授权代码来自Mono项目)。


2
投票

您只需使用X509Certificate2的PrivateKey属性即可。实际返回的私钥实现取决于证书中使用的算法 - 通常这是RSA:

rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 

之后,您应该能够从其ExportParameters属性中获取RSA密钥信息。


0
投票

你可以用OpenSSL Library for .NET做到这一点:

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);

-3
投票

如果您唯一的问题是获取私钥Base64编码,您可以这样做:

var privateKey = x509Certificate2.PrivateKey;
var encoding = new System.Text.ASCIIEncoding();
var base64String = Convert.ToBase64String(encoding.GetBytes(privateKey.ToString()));
© www.soinside.com 2019 - 2024. All rights reserved.