使用来自本地计算机的客户端证书时无法创建 SSL/TLS 安全通道

Posted

技术标签:

【中文标题】使用来自本地计算机的客户端证书时无法创建 SSL/TLS 安全通道【英文标题】:Could not create SSL/TLS secure channel when using client certificate from local machine 【发布时间】:2021-12-15 14:31:57 【问题描述】:

我正在调用需要客户端证书的 API。将客户端证书安装到Current User 的个人存储中,API 调用成功。但是当客户端证书安装到Local Machine 的个人存储中时,调用失败并显示:

The request was aborted: Could not create SSL/TLS secure channel.

这里是设置代码:

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
       | SecurityProtocolType.Tls11
       | SecurityProtocolType.Tls12
       | SecurityProtocolType.Ssl3;            
ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>  return true; ;

const StoreName storeName = StoreName.My;
const X509FindType findType = X509FindType.FindByThumbprint;
const string findValue = "9ce5b57fe576b9a0933b426347e74e5583da59dd";

var certCurrentUser = GetCertificate(storeName, StoreLocation.CurrentUser, findType, findValue);
var certLocalMachine = GetCertificate(storeName, StoreLocation.LocalMachine, findType, findValue);

GetCertificate() 的两次调用都成功并且证书似乎相同。 (它们是从同一个 .pfx 安装的)

当使用certCurrentUser 进行此调用时,它会成功:

WebRequestHandler handler = new WebRequestHandler();
handler.ClientCertificates.Add(certCurrentUser); 
using (var client = new HttpClient(handler))

    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var response = await client.GetAsync("https://preprod.xconnectcollection.ce.corp.com/odata");

但是当使用certLocalMachine 进行调用时,它会失败:

WebRequestHandler handler = new WebRequestHandler();
handler.ClientCertificates.Add(certLocalMachine); 
using (var client = new HttpClient(handler))

    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var response = await client.GetAsync("https://preprod.xconnectcollection.ce.corp.com/odata");

错误:

The request was aborted: Could not create SSL/TLS secure channel.

使用本地计算机的客户端证书时,可能导致请求失败的原因是什么?

【问题讨论】:

证书需要在机器和用户中。请参阅:docs.microsoft.com/en-us/windows-hardware/drivers/install/… @jdweng,您的建议不正确。 @jdweng,首先,我认为这不是真的。但是,它恰好安装在两者中,当我尝试从本地计算机获取它时它仍然无法正常工作。 @MarkGood,这是因为您的 Web 应用程序在应用程序池帐户下运行,该帐户无权访问存储在本地计算机中的私钥。要么使用 CurrentUser 存储,要么显式授予您的应用程序池对安装在 LocalMachine 存储中的私钥的读取权限。 @Crypt32 这很有趣,很高兴知道,谢谢!但是,我的应用程序是控制台应用程序,而不是 Web 应用程序。它不会像我一样运行吗?而且我可以从两个位置读取证书,但我似乎无法在本地机器中使用该证书。 :-( 【参考方案1】:

确保运行应用程序的帐户拥有证书私钥的完全权限。

【讨论】:

OP 在机器和用户中都加载了证书。除非 OP 从机器中删除证书,否则我们永远不会知道证书是否仅适用于为用户加载的证书。

以上是关于使用来自本地计算机的客户端证书时无法创建 SSL/TLS 安全通道的主要内容,如果未能解决你的问题,请参考以下文章

如何在本地使用 wamp 时摆脱 payum“SSL 证书问题:无法获取本地颁发者证书”错误

在 Service Fabric 中通过 HTTPS 调用 WCF:请求被中止:无法创建 SSL/TLS 安全通道

如何为通过 SSL 进行双向身份验证的本地测试创建客户端证书?

PHP - SSL 证书错误:无法获取本地颁发者证书

PHP - SSL 证书错误:无法获取本地颁发者证书

PHP - SSL 证书错误:无法获取本地颁发者证书