从字符串创建X509Certificate2时“无法找到请求的对象”exception
我正在尝试从字符串创建X509Certificate2
。 让我举个例子:
string keyBase64String = Convert.ToBase64String(file.PKCS7); var cert = new X509Certificate2(Convert.FromBase64String(keyBase64String));
和keyBase64String
有这样的内容: "MIIF0QYJKoZI ........hvcNAQcCoIIFwjCCBb4CA0="
和file.PKCS7
是我从数据库下载的字节数组 。
创建X509Certificate2
时,我遇到以下exception:
找不到请求的对象
并且堆栈跟踪:
“无法在系统中的System.Security.Cryptography.X509Certificates.X509Utils._QueryCertBlobType(Byte [] rawData)的System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32hr)中找到请求的对象”X509Certificate2exception“无法找到请求的对象”}。 WebApp.SoupController.d__7.MoveNext()上的System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte [] rawData)中的Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte [] rawData,Object password,X509KeyStorageFlags keyStorageFlags)在D:\ Projects \ WebApp \ Controllers \ SoupController.cs中:第118行
请告诉我我做错了什么。 任何帮助将不胜感激!
如果file.PKCS7
代表PKCS#7 SignedData blob(从X509Certificate2(Collection).Export(X509ContentType.Pkcs7)生成的内容),则有两种不同的方法可以打开它:
-
new X509Certificate2(byte[])
/new X509Certificate2(string)
- 单个证书构造函数将提取SignedData blob的签名证书。 如果这只是作为证书集合导出,但没有签署任何内容,则没有此类证书,因此
Cannot find the original signer.
(Win 2012r2,其他版本可以将其映射到不同的字符串)
- 单个证书构造函数将提取SignedData blob的签名证书。 如果这只是作为证书集合导出,但没有签署任何内容,则没有此类证书,因此
-
X509Certificate2Collection::Import(byte[])
/X509Certificate2Collection::Import(string)
- 集合导入将使用所有“额外”证书,忽略签名证书。
因此,如果它真的是PKCS#7,您可能需要集合Import(实例)方法。 如果不是,则您有一些奇怪的变量/字段/属性名称。
X509Certificate2的构造函数希望获得证书文件名,但是你给它一个键( X509Certificate2 Constructor(String) )
我假设keyBase64String是证书密钥,并且证书安装在执行代码的机器上。 试试这个:
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); store.Open(OpenFlags.ReadOnly); var certCollection = store.Certificates.Find(X509FindType.FindByThumbprint, keyBase64String , false); //var certCollection = store.Certificates.Find(X509FindType.FindByKeyUsage, keyBase64String , false); //var certCollection = store.Certificates.Find(X509FindType.FindBySubjectKeyIdentifier, keyBase64String , false); var cert = certCollection[0];
您还可以尝试FindByKeyUsage,FindBySubjectKeyIdentifier或其他类型的X509FindType枚举