记录一次Https请求的报异常请求被中止: 未能创建 SSL/TLS 安全通道的问题

问题

使用了TLS1.2还是报异常 请求被中止: 未能创建 SSL/TLS 安全通道。(The request was aborted: Could not create SSL/TLS secure channel. )
问题描述如上,写在这里方便搜索引擎抓取,希望可以帮到同行,也作为一次踩坑的记录。

前言

项目中需要请求第三方接口进行数据交互,我方为接口服务调用方,接口提供方的站点仅开放了Https请求端口。在本地开发功能时一切正常,项目打包丢到服务器上就会报错
请求被中止: 未能创建 SSL/TLS 安全通道。 (The request was aborted: Could not create SSL/TLS secure channel.)

过程

C#请求https接口需要在发送请求前设置一下请求的协议,一般来说加上以下代码

//始终验证服务器证书
ServicePointManager.ServerCertificateValidationCallback = 
(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) => { return true;};
//设置协议
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3  | 
                                       SecurityProtocolType.Tls12 | 
                                       SecurityProtocolType.Tls11 | 
                                       SecurityProtocolType.Tls;

如果 项目的.NetFramework版本过低 System.dll Version=2.0.0.0, SecurityProtocol 枚举类型只有Ssl3和Tls时,可以像下面这样写:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | 
                                       SecurityProtocolType.Tls | 
                                       (SecurityProtocolType)192 | 
                                       (SecurityProtocolType)768 | 
                                       (SecurityProtocolType)3072;

一般来说,写到这里问题就解决了。但是加了这个,程序在服务器上依然报错,请求被中止: 未能创建 SSL/TLS 安全通道。
首先想到的是服务器环境的问题,放个Postman到服务器上,请求目标站点API,请求通过,成功拿到数据... 删除Postman
这样来看就是IIS的问题了,应该是IIS作为客户端请求对方服务端请求失败了。 为了验证IIS到底支不支持请求HTTPS,我将接口的域名换成了 https://www.baidu.com/api/... ,捕获到的异常不再是 "请求被中止: 未能创建 SSL/TLS 安全通道。",变成了 错误代码404.这样看来就是目标站点的问题。使用 https://myssl.com/ 测试一下

发现目标服务器只支持TLS1.2且只支持一种TLS加密套件,并且模拟客户端握手很多低版本客户端都会握手失败,问题可能就是出现在这里

再到我方服务器下查找支持的TLS加密套件 ,WIN+R键 输入 gpedit.msc 进入组策略编辑器,计算机配置(Computer Configuration)->管理模板(Administrative Templates)->网络(Network)->SSL配置设置(SSL Configuration Settings)->SSL密码套件顺序(SSL Cipher Suite Order) 点击已启用(Enabled),把下方的SSL密码套件复制出来放到文本编辑器里(这里我用Win10的截图)

果然在这里没找到目标服务器支持的TLS1.2套件,仅支持一种套件这种情况肯定是对方服务器做了限制,沟通后让对方放开了部分TLS1.2套件,请求接口后终于不再报异常了。

结语

经过一系列的调试,最后发现是我方测试服务器因为系统版本太低的原因IIS不支持目标服务器的TSL的新型加密套件,导致https 请求第一次握手失败。
以下文章起到了很大的帮助,感谢!!
https://bbs.csdn.net/topics/392432872
https://blog.csdn.net/pijianzhirui/article/details/70198695

posted @ 2021-08-10 13:32  『24k纯帅』  阅读(1958)  评论(1编辑  收藏  举报