首页 文章

从string创建X509Certificate2时出现'Cannot find the requested object'异常

提问于
浏览
6

我想从字符串创建 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(Int32hr)中找到所请求的对象”},位于系统的System.Security.Cryptography.X509Certificates.X509Utils._QueryCertBlobType(Byte [] rawData)处.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte [] rawData,Object password,X509KeyStorageFlags keyStorageFlags)位于WebApp.SoupController.d__7.MoveNext的System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte [] rawData) )在D:\ Projects \ WebApp \ Controllers \ SoupController.cs:第118行

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

2 回答

  • 0

    如果 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,其他版本可以将其映射到不同的字符串)

    • X509Certificate2Collection::Import(byte[]) / X509Certificate2Collection::Import(string)

    • 集合导入将使用所有"extra"证书,忽略签名证书 .

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

  • 2

    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

相关问题