背景介绍

近期收到同事反馈,在C#程序中通过HTTPClient请求一个HTTPS的地址时,在本地开发环境和测试环境均能正常执行,而部署到生产环境后发生异常且稳定复现,异常提示为:【请求被中止: 未能创建 SSL/TLS 安全通道 】,而且在生产环境用浏览器访问是没问题的。

目标站点和运行环境介绍

  • 目标站点SiteA(同事对接的站点):jc.ebopark.com
  • 目标站点SiteB(对比站点):www.howsmyssl.com
  • 生产环境服务器MA1:Windows Server 2016 Datacenter+.NET Framework 4.8,镜像来自Azure
  • 测试环境服务器T1:Windows Server 2016 Datacenter+.NET Framework 4.8,镜像来自Azure
  • 本地临时VMware虚拟机VM1:Windows Server 2016 Datacenter+.NET Framework 4.8,镜像来自微软官网

初步分析

自然的,根据异常信息先进行一圈Google(不用百度),基本都是在说ServicePointManager.SecurityProtocol的赋值,但是本次的程序中已经配置了全部协议。在了解了大概背景之后,基本断定该故障与源码本身的关系不大,仔细检查源码后也确实没有问题。大家也能看得出,很明显的环境不同导致的故障,那么宿主环境的差异就是我们优先要排查分析的线索。

这里要引入HTTPS的一些知识点

1、关于HTTP、HTTPS、TLS的关系:HTTPS连接是由HTTP协议与TLS协议共同完成。

2、建立HTTPS连接不仅需要Client与Server双方的TLS协议版本号兼容,还需要Cipher Suites(密码套件)兼容。关于什么是Cipher Suites可以自行查阅资料,本文不详细展开说明。Cipher Suites的样子如图所示:

进一步验证

有了以上理论支撑,下面就开始对本次案例的站点和运行环境进行一一分析;

首先,通过在线工具验证目标站点SiteA自身的HTTPS连接功能是否OK:

截图报告显示SiteA支持TLS1.2、TLS1.3协议,同时也可以看到对应的密码套件。说明该站点自身配置没问题,这也符合同事的测试结果。

根据前面提到的知识点,下一步就需要判断连接的Client端(即C#应用)所支持的协议和密码套件。先看在程序中配置的是支持TLS全协议:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 |
SecurityProtocolType.Tls |
SecurityProtocolType.Tls11 |
SecurityProtocolType.Tls12 |
(SecurityProtocolType) 12288;

其次查看运行时部署的.NET Framework 4.8对TLS的兼容情况,如下图所示,环境对TLS1.2、TLS1.3均支持。

现在TLS协议看起来是兼容的,那么该如何查看C#应用所使用的密码套件?这里用到一个工具:IISCrypto.exe

生产环境服务器MA1的密码套件如下图所示。经过仔细对比,该OS没有与目标站点SiteA匹配的密码套件,因此无法建立连接,符合实际情况。

测试环境服务器T1的密码套件如下图所示。该OS中有2组和目标站点SiteA的TLS1.2密码套件匹配,因此可以建立链接,符合实际情况。

本地临时VMware虚拟机VM1的密码套件如下图所示,该OS中有多组和目标站点SiteA的TLS1.2密码套件匹配,因此可以建立链接,符合实际情况。

经过上述对比后,基本可以判定是由于生产环境的服务器密码套件与目标站点不匹配导致。

解决方案比较简单,使用IISCrypt工具把缺少的密码套件勾选,并择机重启服务器生效即可。

延伸1:如何创建TLS1.3协议的连接?

根据前面对几台服务器的密码套件的分析,兼容的密码套件都是最多是TLS1.2版本的,那是否真可以创建TLS1.3的连接呢?所幸我本地开发环境比较新,是Windows11,经过查看密码套件可以兼容TLS1.3:

使用工具在只选择TLS1.3协议的情况下,验证是可以成功请求的:

延申2:Edge浏览器所支持的密码套件自带的,独立于Windows。

下图是生产环境服务器MA1上的Edge浏览器的密码套件支持情况。

通过该浏览器直接请求目标站点SiteA,不仅可以请求成功而且还是走的TLS1.3协议。

总结

本文针对实际开发中遇到怪异现象,结合HTTPS的理论知识,透彻的分析了故障原因并最终解决。本文中还提到了几个实用的工具,可以更方便的查看相关细节。最后针对生产服务器镜像默认的密码套件问题,后续会继续与运维同事反馈并更新。

参考资料:

  • 查看TLS在线工具:https://myssl.com/ssl.html
  • IISCrypto官网:https://www.nartac.com/Products/IISCrypto/
  • .NET Framework 中的传输层安全性 (TLS) 最佳做法:https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
  • 查看当前连接的tls信息-API版:https://www.howsmyssl.com/a/check

附:苹果推送服务API的TLS信息

C#请求HTTPS地址的故障分析和TLS知识点总结的更多相关文章

  1. java请求https地址如何绕过证书验证?

    原文http://www.blogjava.net/hector/archive/2012/10/23/390073.html 第一种方法,适用于httpclient4.X 里边有get和post两种 ...

  2. 通过证书请求Https站点

    前几天在做与平安银行对接接口,主要是给平安银行推送用户数据(申请贷款的用户),平安银行提供的是https的地址,请求https地址的时候还要发送证书,刚接到这个任务的时候一头雾水,百度上各种所搜,最后 ...

  3. [Delphi]实现使用TIdHttp控件向https地址Post请求[转]

    开篇:公司之前一直使用http协议进行交互(比如登录等功能),但是经常被爆安全性不高,所以准备改用https协议.百度了一下资料,其实使用IdHttp控件实现https交互的帖子并不少,鉴于这次成功实 ...

  4. 彻底解决:请求被中止: 未能创建 SSL/TLS 安全通道

    最近有个项目要调用客户用java写的带https的webservice,对方提供了证书文件 test.pfx,我这里调用方式如下: //webservice代理类 SvcService svc = n ...

  5. HttpWebRequest请求Https协议的WebApi

    public static class RequestClient { /// <summary> /// 参数列表转为string /// </summary> /// &l ...

  6. C# 解决“请求被中止: 未能创建 SSL/TLS 安全通道”的问题

    最近在开发项目的时候,使用爬虫抓取网络数据的时候,当请求Web数据时,碰到了“请求被中止: 未能创建 SSL/TLS 安全通道”的问题,尝试过很多网上的方法,例如添加证书等都没有用.最后在GitHub ...

  7. 带jsk证书,请求https接口

    首先是三个返回的实体类 BaseVo.java package https2; import java.io.Serializable; import java.lang.reflect.Invoca ...

  8. .NET HttpWebRequest(请求被中止: 未能创建 SSL/TLS 安全通道)和(基础连接已经关闭: 发送时发生错误)问题查找解决

    前言: 前段时间在对接第三方接口的时候发生了一个非常奇葩的问题,就是使用 .NET Framework 4.6 HttpWebRequest进行网络请求的相关问题.背景,关于调用第三方的接口都是使用使 ...

  9. 通过HttpWebRequest请求https接口

    一.为什么进行代理接口的开发: 有些项目需要访问被墙了哒网站,比如前不久公司开发项目需要使用google地图的接口,而google在中国被墙了,所有打算做一个代理接口服务,将代理放到国外服务器上,通过 ...

随机推荐

  1. 从0开始用webpack开发antd,react组件库npm包并发布

    一.初始化一个npm包 1.新建一个文件夹(名称随意,建议和报名一致),输入命令 :npm init -y 会自动生成一个包的说明文件 package.json如下(本文以scroll-antd-ta ...

  2. XCTF练习题---MISC---intoU

    XCTF练习题---MISC---intoU flag:RCTF{bmp_file_in_wav} 解题步骤: 1.观察题目,下载附件 2.解压以后是一个音频文件,听一听,挺嗨的,一边听一边想到音频分 ...

  3. keepalived安装及配置文件详解

    一个执着于技术的公众号 在上一篇文章中,我们对Keepalived进行了简单入门学习: Keepalived入门学习 今天我们继续学习Keepalived服务. 一.安装Keepalived服务 两种 ...

  4. 0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题

    先看图 这个是JavaScript语言自身存在的一个问题.说道这里不得不提一下网上流传的JavaScript搞笑图 我们在使用云开发来开发微信小程序的时候,会经常遇到JavaScript小数计算精度失 ...

  5. CTF简介

    最近在学习渗透测试,后来发现CTF很有趣,发现对学习有所帮助,于是找了几个网站,下面推荐几个我觉得不错的网站 https://www.ctfhub.com/#/index https://adworl ...

  6. MAUI候选版本3发布啦

    我们很高兴发布.NET 多平台应用程序UI (.NET MAUI) 候选版本3,这个版本包含一系列新的改进.与以前的候选版本一样,RC3 包含在"上线"支持政策中,这意味着Micr ...

  7. Spring Security之短信登录

    实现短信验证码登录 前面实现了 用户名+密码 的登录方式,现在实现一下短信验证码登录. 开发短信验证码接口 短信验证码和图形验证码类似,用户从手机短信得到验证码和从图片得到验证码类似. 校验短信验证码 ...

  8. webpack基础知识介绍

    1.开发模式 开发模式顾名思义就是我们开发代码时使用的模式 webpack默认只处理js文件,对样式是没办法处理的.因此要处理css资源需要引入CSS-loader 处理CSS资源 如果要使用 css ...

  9. Hadoop进程理解

    进程理解 HDFS相关进程理解(NN,DN,SSN) NameNode中存放的是数据文件与元数据的映射信息,数据文件和block快的映射信息,block块和DataNode的映射信息,前两者存放在磁盘 ...

  10. springcloud-- Alibaba-nacos--支持的几种服务消费方式

    通过<Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现>一文的学习,我们已经学会如何使用Nacos来实现服务的注册与发现,同时也介绍如何通过LoadBal ...