【问题标题】:Convert PEM string to PFX file to load in X509Certificate in C#?将 PEM 字符串转换为 PFX 文件以在 C# 中的 X509Certificate 中加载?
【发布时间】:2018-06-18 03:56:54
【问题描述】:

我有私钥的 PEM 字符串。想要将此加载到私钥部分的 x509Certifcate 中吗?

----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALyuJDi0hk6pMSYB
ZaW4e6vxrQv5fWuWZoXQT0BpWOgBKlyfwsRT1L/2vPnzhmfn/JrAjTVbO+/w53+u
dprOgzVI75ILg1ONivtBu6ivz+iAgV87MJtRPbVaee52DGvwFZ2tMUTtKNhO10IN
0+RuE8F/EZOs2DOTGiP6F7Wo4JStAgMBAAECgYAhDbzItk9lDlzO1KXS/1ujBqaT
F3TyWRnCzXhkx0/M7Q9XxKEhNbJqorX+b7wXDdwB3EOgmkgIw8I6avzaJ91yNido
Mruenc+FJJXntcIeW1E+OnHAnoY5OvLk4aQy1j7ZDnxpzVhc/y1WFDIKvszNAChV
QBrolHu4GmWcpVunPQJBAOc28JVRYd++AiKOk1HP6iJSanND5tb8sCjINMbZGSh+
3aS0KmVE0RpaDE7hxvsq4arqdie8HSyj8mfPFF46G+8CQQDQ5/X9O+z26W0RSJed
mMwZYbGPcej7hG6GT6+jcqNgPvrHucTvcAcgR6rdKA30mm94s9O6IU/rapA+sioF
lm0jAkASi/SmdZ29PdecAAXPNTdZw3SohFTa/+/9hXm+TaHX/r02vgD8mJWRYJHG
LhQxB5KMjDwoGc3ZS9lg/Fps6IpfAkB1BfueZ7tOdWRLkkacWcO7VCaLHFxOyNjB
FFJnVQiAGceRqlbPagoT4xGr4YwvwXNAQjwQwChsz70N4e/4QVPRAkEAn3bnuuUb
l5geVfamQwxCLnNbKcAQTdd5Ud69gZ5+c8WTt3ecJ/erccRXTcizEQxcMsfVivhz
qO88dh2HgL4Ijw==
-----END PRIVATE KEY-----

代码:

byte[] certificatebytes = Encoding.ASCII.GetBytes(x509CertificateString);
X509Certificate2 x509Certificate3 = new X509Certificate2(certificatebytes,"");
x509Certificate.Import(certificatebytes,"",X509KeyStorageFlags.DefaultKeySet);

代码说明:

将 PEM 字符串转换为字节,然后加载到 x509Certificate2 抛出异常: System.Security.Cryptography.CryptographicException: '找不到 请求的对象。 ?

【问题讨论】:

  • 私钥就是私钥。您需要证书的公共部分来实例化X509Certificate2 对象。
  • 如何从 PEM 字符串中提取公钥以加载到 x509Certificate 中?
  • 你能帮我解决这个问题吗?
  • 我猜,你需要完整的公共证书,而不仅仅是公钥。您无法从私钥恢复 publuc 证书。
  • 我有 PEM 字符串形式的私钥

标签: x509certificate pfx


【解决方案1】:

私钥和证书是不同的东西。你可以用私钥发明一个自签名证书,但你不能只是“得到一个”。

.NET 没有很多用于读取密钥的优秀 API。由于这是未加密的 PKCS#8 格式的私钥(“BEGIN PRIVATE KEY”,与“BEGIN RSA PRIVATE KEY”或“BEGIN ENCRYPTED PRIVATE KEY”),因此 CNG 可以读取它。你需要去掉页眉和页脚,然后将base64字符串转换回字节序列。

string noHeaderOrFooter = @"
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALyuJDi0hk6pMSYB
ZaW4e6vxrQv5fWuWZoXQT0BpWOgBKlyfwsRT1L/2vPnzhmfn/JrAjTVbO+/w53+u
dprOgzVI75ILg1ONivtBu6ivz+iAgV87MJtRPbVaee52DGvwFZ2tMUTtKNhO10IN
0+RuE8F/EZOs2DOTGiP6F7Wo4JStAgMBAAECgYAhDbzItk9lDlzO1KXS/1ujBqaT
F3TyWRnCzXhkx0/M7Q9XxKEhNbJqorX+b7wXDdwB3EOgmkgIw8I6avzaJ91yNido
Mruenc+FJJXntcIeW1E+OnHAnoY5OvLk4aQy1j7ZDnxpzVhc/y1WFDIKvszNAChV
QBrolHu4GmWcpVunPQJBAOc28JVRYd++AiKOk1HP6iJSanND5tb8sCjINMbZGSh+
3aS0KmVE0RpaDE7hxvsq4arqdie8HSyj8mfPFF46G+8CQQDQ5/X9O+z26W0RSJed
mMwZYbGPcej7hG6GT6+jcqNgPvrHucTvcAcgR6rdKA30mm94s9O6IU/rapA+sioF
lm0jAkASi/SmdZ29PdecAAXPNTdZw3SohFTa/+/9hXm+TaHX/r02vgD8mJWRYJHG
LhQxB5KMjDwoGc3ZS9lg/Fps6IpfAkB1BfueZ7tOdWRLkkacWcO7VCaLHFxOyNjB
FFJnVQiAGceRqlbPagoT4xGr4YwvwXNAQjwQwChsz70N4e/4QVPRAkEAn3bnuuUb
l5geVfamQwxCLnNbKcAQTdd5Ud69gZ5+c8WTt3ecJ/erccRXTcizEQxcMsfVivhz
qO88dh2HgL4Ijw==";

byte[] p8bytes = Convert.FromBase64String(noHeaderOrFooter );

using (CngKey key = CngKey.Import(p8bytes, CngKeyBlobFormat.Pkcs8PrivateBlob))
{
    Console.WriteLine(key.Algorithm);
}

在 using 块中,您有一个关键对象。但是,同样,这并没有给你一个证书。关系是

  • 创建了一个私钥。
  • 从私钥派生公钥。
  • 公钥与其他一些数据一起发送给证书颁发机构。
  • 证书颁发机构生成证书。

您可以通过私钥再次启动该流程,但不能只是从中“获取”证书。

【讨论】:

    猜你喜欢
    • 2017-01-27
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2019-07-05
    • 2018-07-18
    • 2023-03-20
    • 2019-08-06
    • 1970-01-01
    相关资源
    最近更新 更多