首页 > 解决方案 > ASP NET Core Web API 禁用 TLS 1.0 和 TLS 1.1 支持

问题描述

我正在尝试禁用对在 docker (Debian OS) 和 .NET 5 上运行的 API 的 TLS 1.0 和 TLS 1.1 支持。我发现此代码与此特定问题相关:

     public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.ConfigureKestrel(opt =>
                    {
                        opt.ConfigureHttpsDefaults(s =>
                        {
                            s.SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls13;
                        });
                    }).UseStartup<Startup>();
                }
            );

但是,在发布更改时,我正在运行一个脚本来确定服务器是否仍然支持 TLS1.0 和 TLS1.1,令人惊讶的是,尽管我明确地将 HTTPS 默认设置为 TLS1.2 和 TLS1.3,但我得到了以下结果: 在此处输入图像描述

这是 Powershell 脚本:

 $HostName = 'YOUR_URL'
 $Port = '443'
 
 $RetValue = New-Object psobject -Property @{
            Host = $HostName
            Port = $Port
            SSLv2 = $false
            SSLv3 = $false
            TLSv1_0 = $false
            TLSv1_1 = $false
            TLSv1_2 = $false
            TLSv1_3 = $false
            KeyExhange = $null
            HashAlgorithm = $null
        }
        "ssl2", "ssl3", "tls", "tls11", "tls12","tls13" | %{
            $TcpClient = New-Object Net.Sockets.TcpClient
            $TcpClient.Connect($RetValue.Host, $RetValue.Port)
            $SslStream = New-Object Net.Security.SslStream $TcpClient.GetStream(),
                $true,
                ([System.Net.Security.RemoteCertificateValidationCallback]{ $true })
            $SslStream.ReadTimeout = 15000
            $SslStream.WriteTimeout = 15000
            try {
                $SslStream.AuthenticateAsClient($RetValue.Host,$null,$_,$false)
                $RetValue.KeyExhange = $SslStream.KeyExchangeAlgorithm
                $RetValue.HashAlgorithm = $SslStream.HashAlgorithm
                $status = $true
            } catch {
                $status = $false
            }
            switch ($_) {
                "ssl2" {$RetValue.SSLv2 = $status}
                "ssl3" {$RetValue.SSLv3 = $status}
                "tls" {$RetValue.TLSv1_0 = $status}
                "tls11" {$RetValue.TLSv1_1 = $status}
                "tls12" {$RetValue.TLSv1_2 = $status}
                "tls13" {$RetValue.TLSv1_3 = $status}
            }
            # dispose objects to prevent memory leaks
            $TcpClient.Dispose()
            $SslStream.Dispose()
        }
        $RetValue

这是 Kestrel 配置上的错误吗?我可以做其他事情来禁用 TLS1.0 和 TLS1.1 加密吗?

编辑这是我试图解决的原始问题:

远程服务接受使用 TLS 1.0 加密的连接。TLS 1.0 有许多加密设计缺陷。较新版本的 TLS 是针对这些缺陷而设计的,应尽可能使用。PCI DSS v3.1 要求在 2018 年 6 月之前完全禁用 TLS 1.0,销售点终端及其终止点除外。自 2020 年 3 月 31 日起,未启用 TLS 1.2 及更高版本的端点将不再与主要 Web 浏览器和主要供应商一起正常运行。

标签: c#asp.net-coressl.net-5kestrel-http-server

解决方案


自 .net 5 起,禁用 TLS 版本的选项似乎已被删除,而是必须在操作系统中禁用。

Kestrel 现在使用系统默认的 TLS 协议版本,而不是像以前那样限制与 TLS 1.1 和 TLS 1.2 协议的连接。

https://docs.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/5.0/kestrel-default-supported-tls-protocol-versions-changed

那么问题可能变成:如何在使用 Debian 的 docker 映像中禁用它,似乎可以通过 dockerfile 中的 docker RUN OpenSSL 命令来完成,在 OpenSSL 或 OpenSSL 的配置文件中禁用它。

如何在 OpenSSL 中禁用 TLS v1.0 和 TLS v1.1

在 oid_section 之后的 /etc/ssl/openssl.cnf 中添加:

openssl_conf = default_conf

[default_conf]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2

https://blog.surgut.co.uk/2019/08/how-to-disable-tls-10-and-tls-11-on.html


推荐阅读