无法创建 SSL/TLS 安全通道。安全通道故障

Posted

技术标签:

【中文标题】无法创建 SSL/TLS 安全通道。安全通道故障【英文标题】:Could not create SSL/TLS secure channel. SecureChannelFailure 【发布时间】:2018-12-19 16:01:54 【问题描述】:

使用 SSL 证书进行 SOAP 调用时出现 SSL 错误:

请求被中止:无法创建 SSL/TLS 安全通道。

奇怪的是,如果我在 Firefox 中加载证书并访问端点或调用 API 而不发送任何数据,我不会收到任何错误消息并且连接成功。公开 API 的公司也提到该证书是 kosher。

我正在加载的证书对“所有人”具有完全权限。我已经尝试了我在互联网上看到的所有解决方案,但仍然出现错误。

这是我创建请求的代码:

 ServicePointManager.Expect100Continue = true;
 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
 var request = (HttpWebRequest)WebRequest.Create(plugin.EndPoint);
 request.ContentType = "text/xml; charset=utf-8";
 request.Method = "POST";

获取证书的代码(我也尝试过使用 pfx):

var cert = new 
 509Certificate2(@"C:\clientcert.p12", "FakePassword");
request.ClientCertificates.Add(cert);

以及请求的代码:

  byte[] byteArray = Encoding.UTF8.GetBytes(xml);
    request.ContentLength = byteArray.Length;
    using (var dataStream = request.GetRequestStream())
                
                    dataStream.Write(byteArray, 0, byteArray.Length);
                    dataStream.Close();


                    using (WebResponse response = request.GetResponse())
                    
                        using (var responseStream = response.GetResponseStream())
                        
                            StreamReader reader = 
new StreamReader(responseStream ?? throw new InvalidOperationException());
                            return reader.ReadToEnd();
                        
                    

                

编辑:

这是运行请求的跟踪输出:

System.Net 信息:0:[11844] InitializeSecurityContext(缓冲区内计数=2,缓冲区外长度=0, 返回代码=CertUnknown)。 System.Net 错误:0:[11844] 中的异常 HttpWebRequest#63832831:: - 请求被中止:无法创建 SSL/TLS 安全通道.. System.Net 错误:0:[11844] 中的异常 HttpWebRequest#63832831::EndGetRequestStream - 请求是 中止:无法创建 SSL/TLS 安全通道..

我还更改了 SecurityProtocol:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

第二次编辑:我可以让它在 SoapUI 中工作,但不能在 .NET 应用程序中工作,只需从 SOAP UI 中的文件系统加载 SSL 证书。

【问题讨论】:

... 或在不发送任何数据的情况下调用 API,我没有收到任何错误消息 - 你确定你真的联系了服务器吗?案子? - 您可以尝试将所有值作为当前的 TLS 1.2 应用到 SecurityProtocol 或什么都不做。如果您对请求启用跟踪,您将获得详细的日志。 经过这么多研究,这个thread 为我工作! System.NET 跟踪说“返回代码=CertUnknown”,所以它必须包含其他信息供您挖掘。类似***.com/questions/9858275/… 这样的话题应该会给你一些提示。 这是一条“它不起作用”的异常消息。非常有意,他们不想给攻击者太多关于他做错了什么的信息。在另一台机器上启用日志记录,以便您确切地知道出了什么问题:support.microsoft.com/en-us/help/260729/… 如果日志内容没有帮助,那么您现在有很好的信息可以在 serverfault.com 上提问 【参考方案1】:

出于兴趣,您的应用正在使用 TLS 1.0、1.1 和 1.2 协议,但是否在 Internet Explorer 中启用了它的使用?

如果 web.config 中没有,请添加

<appSettings>
    <add key="SecurityProtocol" value="Tls12" />
</appSettings>

然后在 IE 的高级设置选项卡中检查它是否已启用:“使用 TLS 1.2”

【讨论】:

【参考方案2】:

您的 SSL 证书由未安装在 Windows 中的根证书签名。

Firefox 附带它自己的受信任根证书列表,其中包含您正在使用的证书的根证书。仅仅因为 Firefox 信任证书并不意味着 Windows 信任它。

解决方案是在运行您的应用的计算机上安装您的证书的根证书或证书链。

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-create-temporary-certificates-for-use-during-development

如果这是一个拥有广泛受众的应用程序,更简单的解决方案是切换到已使用 Windows 附带的根证书的 SSL 提供程序。

【讨论】:

我使用 openssl 对证书进行自签名以进行测试。在上面的代码中,我从硬盘驱动器加载它,但是当我在我的证书本地存储中使用指纹检索它时,我得到了同样的错误。 见上面的链接。 我想我可以使用 MakeCert 而不是 OpenSSL,但是该证书已与其他实现一起使用,并且他们已经对其进行了验证。我需要继续使用该证书,除非我能给出足够充分的理由说明它为什么不起作用,或者 makecert 是 openssl 的更好替代品 您是否有一个正在使用的自签名证书,或者您是否有一个您一直在使用的证书颁发机构的实际证书?这是跨企业部署还是仅部署在几台机器上? 我有一个我一直在使用的自签名证书。它将于 2026 年到期,因此第 3 方希望继续使用该证书。我们的应用程序部署在 Azure 中,但我正在本地机器上进行测试。我不确定他们的架构。【参考方案3】:

有时我也有这个错误。我为克服这个问题所采取的步骤如下:

    从 IIS 导出您的证书 双击证书并按照向导进行操作 下一个存储位置“本地计算机”-> 填写导出时选择的密码 选中将证书放入商店的选项并选择您的“受信任的根证书颁发机构” 完成 -> 检查导入是否成功,输入“Windows 搜索”“certmgr.msc”导航到“受信任的根证书颁发机构”,然后找到证书文件夹。应提供导入的证书。 使用您的应用程序进行测试。

希望对你有帮助

【讨论】:

感谢您的回答。我已将其添加到“受信任的根证书颁发机构”中,但仍然出现错误

以上是关于无法创建 SSL/TLS 安全通道。安全通道故障的主要内容,如果未能解决你的问题,请参考以下文章

“请求被中止:无法创建 SSL/TLS 安全通道”

HttpClientHandler / 请求被中止:无法创建 SSL/TLS 安全通道

请求中止无法创建 SSL/TLS 安全通道 - HttpWebRequest

请求被中止:无法创建 SSL/TLS 安全通道 - 没有证书

Braintree 中的“请求被中止:无法创建 SSL/TLS 安全通道”错误

请求被中止:无法为 HttpWebRequest 创建 SSL/TLS 安全通道