如何让C# HttpListener拒绝TLS 1.2以下版本的握手请求
解决HttpListener拒绝TLS1.2以下版本握手的问题
你之前用ServicePointManager配置安全协议的方式不对——这个类是用于客户端发起请求时指定协议版本的,对作为服务端的HttpListener完全无效。另外你的exe.config里多个<AppContextSwitchOverrides>节点会被最后一个覆盖,等于之前的设置都没生效,得合并成一条。
下面是无需修改注册表的有效方案:
1. 修正exe.config配置
把所有开关合并到一个<AppContextSwitchOverrides>节点,并且调整开关值(之前的true设置会阻止强加密和系统默认TLS版本启用,必须改成false):
<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <AppContextSwitchOverrides value="Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols=false;Switch.System.Net.DontEnableSchUseStrongCrypto=false;Switch.System.Net.DontEnableSystemDefaultTlsVersions=false;Switch.System.ServiceModel.DontEnableSystemDefaultTlsVersions=false"/> </runtime> </configuration>
2. 代码中添加SSL握手回调,提前拒绝低版本请求
HttpListener支持通过SslServerAuthenticationCallback在握手阶段直接验证TLS版本,一旦发现低于1.2就取消握手,不用等到请求进入后续处理环节:
// 初始化HttpListener m_server = new HttpListener(); // 添加你的HTTPS前缀(替换成实际的地址和端口) m_server.Prefixes.Add("https://*:443/"); // 绑定SSL认证回调 m_server.SslServerAuthenticationCallback += (sender, args) => { // 检查客户端使用的TLS版本 if (args.SslProtocol < SslProtocols.Tls12) { // 直接拒绝握手 args.Cancel = true; return; } // 可选:添加自定义客户端证书验证逻辑(如果你的服务需要客户端证书) // args.ClientCertificateValidationCallback = (certSender, cert, chain, errors) => // { // return errors == SslPolicyErrors.None; // 仅当证书无错误时通过 // }; // 允许正常握手 args.Cancel = false; }; // 启动服务 m_server.Start();
关键说明
- 这个回调是在SSL握手过程中触发的,比你之前“握手后检查证书版本”的方式更高效,能直接阻断不符合要求的连接。
- .NET 4.6原生支持TLS1.2,只要配置正确就不会有兼容性问题,且所有设置都只作用于当前应用,不会影响服务器上的其他遗留程序。
内容的提问来源于stack exchange,提问作者metalbea
相关产品推荐
相关产品推荐

