C# HttpClient如何配置指定TLS密码套件访问Riot API
C# HttpClient 配置等效JS TLS密码套件方案
参考JS配置说明
对接Riot REST API的JS脚本TLS配置如下,核心规则共3项:
const ciphers = [ 'TLS_CHACHA20_POLY1305_SHA256', 'TLS_AES_128_GCM_SHA256', 'TLS_AES_256_GCM_SHA384', 'TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256' ]; const agent = new Agent({ ciphers: ciphers.join(':'), honorCipherOrder: true, minVersion: 'TLSv1.2' });
- 仅允许列表内4个密码套件,优先级按数组顺序从高到低
- 强制使用客户端指定的套件优先级,不采用系统默认排序
- 最低支持TLS版本为1.2,兼容更高版本
API强制校验上述规则后,未做对应配置的C# HttpClient会直接返回403 Forbidden。
可行实现方案
.NET 5+ (含.NET 6/7/8/9,官方原生支持)
直接通过SocketsHttpHandler配置SSL选项即可完全对齐JS逻辑,代码如下:
using System.Net.Http; using System.Net.Security; using System.Security.Authentication; // 严格按照JS顺序排列密码套件,保证优先级一致 var cipherPolicy = new CipherSuitesPolicy(new [] { TlsCipherSuite.TLS_CHACHA20_POLY1305_SHA256, TlsCipherSuite.TLS_AES_128_GCM_SHA256, TlsCipherSuite.TLS_AES_256_GCM_SHA384, TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 }); var clientHandler = new SocketsHttpHandler { SslOptions = new SslClientAuthenticationOptions { // 对应honorCipherOrder: true,严格遵循配置的套件顺序 CipherSuitesPolicy = cipherPolicy, // 对应minVersion: 'TLSv1.2',仅允许TLS1.2、TLS1.3 EnabledSslProtocols = SslProtocols.Tls12 | SslProtocols.Tls13 } }; // 用配置好的Handler初始化HttpClient即可正常发起请求 var httpClient = new HttpClient(clientHandler);
注意事项
- 旧版Windows系统(Windows 10 21H1以前、Windows Server 2022以前)系统层不支持CHACHA20系列密码套件,即使代码中正确配置,TLS握手时也不会携带对应套件,依然会被API拦截。这种情况要么升级Windows版本,要么切换到Linux环境运行程序。
- 不要额外修改
ServicePointManager.SecurityProtocol属性,该全局配置会和Handler内的SSL配置产生冲突,保持默认值即可。
.NET Framework、.NET Core 3.1及更低版本
这类老版本框架没有提供自定义TLS密码套件列表和顺序的官方API,优先选择升级框架到.NET 5+。如果无法升级,可以通过引入libcurl依赖、使用CurlHandler替换默认请求Handler的方式,在libcurl配置中写死对应密码套件规则实现,但配置复杂度高,兼容性不如原生方案稳定。
内容的提问来源于stack exchange,提问作者Dartz
相关产品推荐
相关产品推荐

