我正在尝试从字符串创建X509Certificate2
。让我举个例子:
string keyBase64String = Convert.ToBase64String(file.PKCS7);
var cert = new X509Certificate2(Convert.FromBase64String(keyBase64String));
和keyBase64String
有这样的内容:"MIIF0QYJKoZI ........hvcNAQcCoIIFwjCCBb4CA0="
和file.PKCS7
是我从数据库下载的字节数组。
创建X509Certificate2
时出现以下异常:
找不到请求的对象
堆栈跟踪:
“找不到请求的对象”X509Certificate2异常“找不到 请求对象“} at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(的Int32 hr)at System.Security.Cryptography.X509Certificates.X509Utils._QueryCertBlobType(字节[] rawData)at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(字节[] rawData,Object password,X509KeyStorageFlags keyStorageFlags)at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(字节[] rawData)at WebApp.SoupController.d__7.MoveNext() 在 d:\项目\ Web应用程序\ \控制器SoupController.cs:行 118
请告诉我我做错了什么。任何帮助将不胜感激!
答案 0 :(得分:2)
如果file.PKCS7
表示PKCS#7 SignedData blob(从X509Certificate2(Collection).Export(X509ContentType.Pkcs7)生成的内容),则有两种不同的方法可以打开它:
new X509Certificate2(byte[])
/ new X509Certificate2(string)
Cannot find the original signer.
(Win 2012r2,其他版本可以将其映射到不同的字符串)X509Certificate2Collection::Import(byte[])
/ X509Certificate2Collection::Import(string)
因此,如果它真的是PKCS#7,您可能需要集合Import(实例)方法。如果不是,你有一些奇怪的变量/字段/属性名称。
答案 1 :(得分:0)
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 Enumeration