从字符串创建 X509Certificate2 时出现“找不到请求的对象”异常

问题描述 投票:0回答:3

我正在尝试从字符串创建

X509Certificate2
。让我举个例子:

string keyBase64String = Convert.ToBase64String(file.PKCS7);
var cert = new X509Certificate2(Convert.FromBase64String(keyBase64String));

keyBase64String
有这样的内容:
"MIIF0QYJKoZI ........hvcNAQcCoIIFwjCCBb4CA0="

file.PKCS7
是我从数据库下载的字节数组

创建

X509Certificate2
时出现以下异常:

找不到请求的对象

和堆栈跟踪:

“找不到请求的对象”X509Certificate2 异常“找不到 请求的对象”}位于 System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 小时)在 System.Security.Cryptography.X509Certificates.X509Utils._QueryCertBlobType(Byte[] 原始数据)在 System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData、对象密码、X509KeyStorageFlags keyStorageFlags)位于 System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] 原始数据)在 WebApp.SoupController.d__7.MoveNext() 在 D:\Projects\WebApp\Controllers\SoupController.cs:line 118

请告诉我我做错了什么。任何帮助将不胜感激!

c# encryption public-key-encryption x509certificate2
3个回答
5
投票

如果

file.PKCS7
代表 PKCS#7 SignedData blob(从
X509Certificate2.Export(X509ContentType.Pkcs7)
X509Certificate2Collection.Export(X509ContentType.Pkcs7)
生成的内容),则有两种不同的打开方式:

  • new X509Certificate2(byte[])
    /
    new X509Certificate2(string)
    • 单个证书构造函数将提取 SignedData blob 的签名证书。如果这只是作为证书集合导出,但没有签署任何内容,则不存在这样的证书,因此它会失败并显示
      Cannot find the original signer.
      (Win 2012r2,其他版本可以将其映射到不同的字符串)
  • X509Certificate2Collection::Import(byte[])
    /
    X509Certificate2Collection::Import(string)
    • 集合导入将消耗所有“额外”证书,忽略签名证书。

因此,如果它确实是 PKCS#7,您可能需要集合导入(实例)方法。如果不是,则说明您有一些奇怪的变量/字段/属性名称。


0
投票

我今天遇到了这个问题,但我无法弄清楚问题所在。我的证书是来自 Apple 推送通知认证的 p12 文件。事实证明,这是因为行结尾是 CRLF 而不是 CR,这或多或少使它成为一个无法正确读取的损坏文件。

将其从 CRLF 更改为 CR 后,完美运行!


-1
投票

X509Certificate2 的构造函数期望获得证书文件名,但您给它一个密钥(X509Certificate2 构造函数(字符串)

我假设 keyBase64String 是证书密钥,并且证书安装在执行代码的计算机上。试试这个:

var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certCollection = store.Certificates.Find(X509FindType.FindByThumbprint, keyBase64String , false);
var cert = certCollection[0];

您还可以尝试

FindByKeyUsage
FindBySubjectKeyIdentifier
或其他类型的
X509FindType
枚举

© www.soinside.com 2019 - 2024. All rights reserved.