问题
使用了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到服务器上,可以请求通过... 删除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