x509certificate2中的私钥为空

3

我已经在本地机器存储(win7)上安装了带有私钥的证书。 在C#代码中,我这样做:

        X509Certificate2 cert = null;
        var store = new X509Store(storeName, storeLocation);
        store.Open(OpenFlags.ReadOnly);
        try
        {
            var result = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);
            ServicePointManager.Expect100Continue = true;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            cert = result.Count > 0 
                ? result[0] 
                : null;
        }
        finally
        {
            store.Close();
        }
        return cert;

cert变量中,我有我的证书,但是它存在问题:HasPrivateKey为true,但PrivateKey没有任何对象。如果我在我的Web应用程序的C#代码中使用REST请求发送它,就会出现错误:

AcquireCredentialsHandle() failed with error 0X8009030D.
The request was aborted: Could not create SSL/TLS secure channel.

所有证书存储的权限已被授予。请帮忙解决问题,出了什么问题?

俄语下Certutil的结果(我用“***”隐藏了安全信息):

certutil -store my "cf 35 63 34 14 30 a0 32 ca 4a 58 b9 7a 7a ab 18 a4 47 7d a4"
================ Сертификат 0 ================
Серийный номер: 100030
Поставщик: ******************************
 NotBefore: 07.07.2015 5:00
 NotAfter: 24.12.2023 4:59
Субъект: ********************************
Не корневой сертификат
Шаблон:
Хеш сертификата(sha1): cf 35 63 34 14 30 a0 32 ca 4a 58 b9 7a 7a ab 18 a4 47 7d a4
  Контейнер ключа = 94c3b04b44d51674a1b7de89c10bd7d7_09614f03-cc81-44e6-a978-81773242876c
  Простое имя контейнера: CertReq-ceda22d5-2893-496a-b8c1-5c9ceaed82f1
  Поставщик = Microsoft Strong Cryptographic Provider
Тест шифрования пройден

1
你能展示一下以下命令的结果吗:certutil -store my "thumbprint"。请将 thumbprint 替换为实际值。我怀疑该密钥使用了 CNG 提供程序。 - Crypt32
在第一篇帖子中添加了certutil结果。 - NanoDemoN
证书看起来没问题。实际错误是“未识别包所提供的凭据”。也许这对您有些意义? - Crypt32
谁是根证书颁发机构?最有可能的情况是通信另一方不信任它。至于PrivateKey为空的情况,通常不会从存储中提取此信息。毕竟,您不希望将私钥发送给他人。 - IMil
谢谢你的提示。我在这里找到了答案:https://dev59.com/KmAg5IYBdhLWcg3wq8eU 。我从机器存储中删除了证书,然后将当前用户存储中安装的证书导出为.pfx文件,并将其导入到机器存储中。现在PrivateKey有对象,但我仍然无法收到来自服务器的响应 - 请求超时中止。但是我在Chrome浏览器和Postman中可以正确地收到来自服务器的响应。有什么想法吗? - NanoDemoN
答案在这里:https://msdn.microsoft.com/ru-ru/library/system.net.securityprotocoltype(v=vs.110).aspx。Win7 只能正确使用 SecurityProtocolType.Tls12。谢谢大家。 - NanoDemoN
1个回答

0

我已经解决了这个问题。我从机器存储中删除了证书,然后将当前用户存储中安装的证书导出到.pfx文件中,并将其导入到机器存储中。现在PrivateKey有对象了。 再来一步,我将协议类型从Tls更改为Tls12(适用于Win7+):

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接