我正在尝试从字符串创建
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
请告诉我我做错了什么。任何帮助将不胜感激!
如果
file.PKCS7
代表 PKCS#7 SignedData blob(从 X509Certificate2.Export(X509ContentType.Pkcs7)
或 X509Certificate2Collection.Export(X509ContentType.Pkcs7)
生成的内容),则有两种不同的打开方式:
new X509Certificate2(byte[])
/new X509Certificate2(string)
Cannot find the original signer.
(Win 2012r2,其他版本可以将其映射到不同的字符串)X509Certificate2Collection::Import(byte[])
/X509Certificate2Collection::Import(string)
因此,如果它确实是 PKCS#7,您可能需要集合导入(实例)方法。如果不是,则说明您有一些奇怪的变量/字段/属性名称。
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
枚举