zoukankan      html  css  js  c++  java
  • 记录一次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

  • 相关阅读:
    关于爬虫中常见的两个网页解析工具的分析 —— lxml / xpath 与 bs4 / BeautifulSoup
    纯手工打造简单分布式爬虫(Python)
    原创python:windows解决genymotion appium adb 的问题。
    安装appium桌面版和命令行版
    Appium+Python 自动化appium常用元素定位方法
    python selenium 对浏览器标签页进行关闭和切换
    安装scrapy框架出错的解决
    PyCharm的基本快捷键和配置简介
    python正则表达式详解
    Python多进程库multiprocessing中进程池Pool类的使用
  • 原文地址:https://www.cnblogs.com/Mxy-cnblog/p/15112828.html
Copyright © 2011-2022 走看看