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

如何在.NET 4.6.2的C#程序中获取当前最高支持的TLS版本?

可行解决方案

问题根源

.NET 4.6.2本身没有原生提供直接获取系统最高支持TLS版本的API,而且Windows Server 2019默认确实不支持TLS 1.3(即使手动安装更新开启,.NET 4.6.2的ServicePointManager也无法直接识别TLS 1.3),这是你之前判断逻辑失效的核心原因。

两种实现思路

1. 尝试连接测试(推荐)

直接针对目标服务器尝试TLS 1.3连接,失败后降级到TLS 1.2,这种方式更可靠,无需依赖系统版本判断:

public async Task<HttpResponseMessage> SendRequestWithTlsFallback(string url)
{
    HttpClientHandler handler = new HttpClientHandler();
    // 先尝试启用TLS 1.3(仅在系统支持时生效)
    handler.SslProtocols = SslProtocolsExtension.Tls13 | SslProtocols.Tls12;
    
    using (HttpClient client = new HttpClient(handler))
    {
        try
        {
            return await client.GetAsync(url);
        }
        catch (HttpRequestException ex) when (ex.InnerException is System.Security.Authentication.AuthenticationException)
        {
            // 连接失败,降级到TLS 1.2
            handler.SslProtocols = SslProtocols.Tls12;
            using (HttpClient fallbackClient = new HttpClient(handler))
            {
                return await fallbackClient.GetAsync(url);
            }
        }
    }
}

注意:.NET 4.6.2中SslProtocols.Tls13枚举值不存在,需要手动定义:

public static class SslProtocolsExtension
{
    public const SslProtocols Tls13 = (SslProtocols)0x00003000;
}

2. 通过系统版本间接判断

如果必须提前判断,可以通过Windows版本号来区分:

  • Windows Server 2022的版本号是10.0.20348及以上
  • Windows Server 2019的版本号是10.0.17763

代码实现:

public static SslProtocols GetMaxSupportedTlsVersion()
{
    OperatingSystem os = Environment.OSVersion;
    // 判断是否为Windows Server 2022及以上
    if (os.Platform == PlatformID.Win32NT && os.Version.Major == 10 && os.Version.Build >= 20348)
    {
        return (SslProtocols)0x00003000; // TLS 1.3
    }
    else
    {
        return SslProtocols.Tls12; // 默认为TLS 1.2
    }
}

缺点:如果Server 2019安装了支持TLS 1.3的更新,这种判断会不准确,所以优先推荐第一种方案。

额外注意事项

  • 确保你的.NET 4.6.2应用已经启用了强加密:在app.config或web.config中添加以下配置,避免默认使用旧版本协议:
<configuration>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.Net.DontEnableSchUseStrongCrypto=false;Switch.System.Net.DontEnableSystemDefaultTlsVersions=false" />
  </runtime>
</configuration>

内容的提问来源于stack exchange,提问作者sarawgeek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:15:26