9

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

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

我们通过以下方式获得非对称算法格式的私钥:

x509Certificate2.PrivateKey

现在,我们想从证书中获取Base64格式的私钥——但我们不知道如何去做,这对我们来说非常重要。

4

4 回答 4

6

重要的问题是为什么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 许可代码)。

于 2011-10-10T17:15:28.583 回答
4

您可以简单地使用 X509Certificate2 的 PrivateKey 属性。实际返回的私钥实现取决于证书中使用的算法——通常是 RSA:

rsaObj = (RSACryptoServiceProvider)myCertificate.PrivateKey; 

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

于 2011-10-10T13:51:48.040 回答
0

您可以使用适用于 .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);
于 2019-03-13T13:45:58.593 回答
-4

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

var privateKey = x509Certificate2.PrivateKey;
var encoding = new System.Text.ASCIIEncoding();
var base64String = Convert.ToBase64String(encoding.GetBytes(privateKey.ToString()));
于 2011-10-10T14:01:48.810 回答