.NET Framework 4.8连接仅支持TLS 1.3的HTTPS服务器报错解决
.NET Framework 4.8访问TLS 1.3服务器的SSL/TLS通道问题解决
问题背景
- 运行环境:.NET Framework 4.8、Windows 10(已安装对应框架)
- 需求:从指定地址获取XML数据,目标服务器仅支持TLS 1.3
- 异常表现:
- 初始代码设置
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13时,报错"客户端和服务器无法通信,因为它们没有共同的算法",Wireshark抓包发现未发送TLS Client Hello - 添加Windows 10启用TLS 1.3的注册表设置后,抓包可见Client Hello,但仍报错"请求已中止:无法创建SSL/TLS安全通道"
- 初始代码设置
- 对比验证:同一机器上Chrome浏览器、Python requests库均可正常访问该接口
解决办法
直接移除代码中手动设置ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13的语句,让.NET Framework自动协商TLS版本。
正确代码示例
使用HttpClient
using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main() { using (var httpClient = new HttpClient()) { var response = await httpClient.GetAsync("https://ssi.gouv.fr/uploads/tl-fr.xml"); response.EnsureSuccessStatusCode(); var xmlData = await response.Content.ReadAsStringAsync(); // 后续XML处理逻辑 } } }
使用WebRequest
using System.IO; using System.Net; class Program { static void Main() { var request = WebRequest.Create("https://ssi.gouv.fr/uploads/tl-fr.xml"); using (var response = request.GetResponse()) using (var stream = response.GetResponseStream()) using (var reader = new StreamReader(stream)) { var xmlData = reader.ReadToEnd(); // 后续XML处理逻辑 } } }
原因说明
.NET Framework 4.8默认支持自动TLS协商,会根据系统配置和服务器支持的协议自动选择最优版本(包括TLS 1.3,只要Windows 10已通过注册表启用)。手动强制指定Tls13会限制框架的协商逻辑,可能导致加密套件不匹配,反而无法完成SSL/TLS握手。
内容的提问来源于stack exchange,提问作者xenax
相关产品推荐
相关产品推荐

