x509certificate2 中的空 PrivateKey

Posted

技术标签:

【中文标题】x509certificate2 中的空 PrivateKey【英文标题】:Empty PrivateKey in x509certificate2 【发布时间】:2015-07-07 16:21:21 【问题描述】:

我已经用私钥在本地机器存储 (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 是真的,但 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
Тест шифрования пройден

【问题讨论】:

能否显示以下命令的结果:certutil -store my "thumbprint"。将thumbprint 替换为实际值。我怀疑密钥使用 CNG 提供程序。 在第一篇文章中添加了 certutil 结果。 证书看起来没问题。实际错误是“无法识别提供给包的凭据”。也许这对你有点意义? 谁是root权限?最可能的情况是通信的另一方不信任它。至于 PrivateKey 为空,此信息通常不会从存储中提取。毕竟,您不想将您的私钥发送给另一方。 感谢您的提示。我刚刚在这里找到了答案:***.com/questions/23329040/…。我从机器存储中删除了证书,然后将已安装的证书从当前用户存储导出到 .pfx 文件并将其导入机器存储。现在 PrivateKey 有对象但我仍然无法接收来自服务器的响应 - 请求因超时而中止。但是我在带有 Postman 的 Chrome 浏览器中从服务器得到了正确的响应。有什么想法吗? 【参考方案1】:

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

【讨论】:

以上是关于x509certificate2 中的空 PrivateKey的主要内容,如果未能解决你的问题,请参考以下文章

将私钥与 .net 中的 X509Certificate2 类关联

X509Certificate2 使 IIS 崩溃

如何在.net 中创建一个全新的 x509Certificate2?

如何以编程方式创建有效的自签名 X509Certificate2,而不是从 .NET Core 中的文件加载

从 x509Certificate2 启动 RSACryptoServiceProvider 的最佳方式?

我应该处理 X509Certificate2 吗?