You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:03:12