C# .NET Core 3.1 发起TLS 1.3 Web请求提示无通用算法如何解决?
问题根因分析
- 系统版本限制:Windows 11 21H2/Windows Server 2022及以上版本才原生支持TLS 1.3协议与X25519椭圆曲线加密算法,更低版本Windows未默认启用/不支持该类TLS 1.3所需加密套件,会触发算法不兼容报错
- .NET版本限制:
SecurityProtocolType.Tls13枚举仅在.NET 5/.NET Core 3.0及以上版本原生支持,.NET Framework全版本(最高4.8.1)未官方适配TLS 1.3,手动赋值枚举值也会因底层WinHTTP接口不支持报错 - 代码配置顺序错误:
ServicePointManager.SecurityProtocol的设置需要在创建HttpWebRequest实例前完成,实例创建后对应请求的ServicePoint已经初始化,后续的协议配置不会生效
可行解决方案
方案1:升级运行环境(推荐)
- 升级操作系统到Windows 11 21H2/Windows Server 2022及以上版本,Linux环境需升级内核到4.17+并安装OpenSSL 1.1.1及以上版本
- 项目升级到.NET 5及以上版本,确认System.Net相关程序集版本支持TLS 1.3枚举
- 调整代码配置顺序,可额外添加TLS 1.2作为降级兼容选项,修改后代码示例如下:
// 先配置安全协议再创建请求实例,兼容TLS1.2降级场景 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13 | SecurityProtocolType.Tls12; HttpWebResponse response = null; HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://shop.claytonengineering.com/"); request.KeepAlive = true; request.Headers.Add("Upgrade-Insecure-Requests", @"1"); request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"; request.Headers.Add("Sec-Fetch-Mode", @"navigate"); request.Headers.Add("Sec-Fetch-User", @"?1"); request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3"; request.Headers.Add("Sec-Fetch-Site", @"same-origin"); request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br"); request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.9"); response = (HttpWebResponse)request.GetResponse(); string html = null; using (StreamReader stream = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { html = stream.ReadToEnd(); }
如果调整后仍报错,可手动开启系统级TLS 1.3加密套件支持:打开组策略编辑器,依次进入「计算机配置-管理模板-网络-SSL配置设置」,打开「SSL密码套件顺序」配置项,启用后确认TLS_AES_128_GCM_SHA256等TLS 1.3加密套件、X25519椭圆曲线已在优先级列表中,配置完成后重启系统生效。
方案2:低版本环境兼容方案
无法升级系统或.NET版本的场景下,替换原生HttpWebRequest实现即可:
- 使用自带第三方TLS实现的HTTP请求库,不需要依赖系统原生加密API,内置支持TLS 1.3与X25519、AES_128_GCM等加密套件,无需额外配置系统级加密规则
- 替换后无需再设置
ServicePointManager.SecurityProtocol,直接在对应库的配置项中指定使用TLS 1.3即可
内容的提问来源于stack exchange,提问作者Jay Metro
相关产品推荐
相关产品推荐

