Kestrel:默认支持的 TLS 协议版本已更改

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

此更改允许:

  • 在支持 TLS 1.3 的环境中默认使用它。
  • 在某些环境(例如默认的 Windows Server 2016)中使用 TLS 1.0,但这通常不理想

有关讨论,请参阅 dotnet/aspnetcore#22563

引入的版本

5.0 预览版 6

旧行为

Kestrel 过去默认要求连接使用 TLS 1.1 或 TLS 1.2。

新行为

Kestrel 允许操作系统选择要使用的最佳协议,并阻止不安全的协议。 HttpsConnectionAdapterOptions.SslProtocols 现在默认为 SslProtocols.None,而不是 SslProtocols.Tls12 | SslProtocols.Tls11

更改原因

进行此项更改是为了在 TLS 1.3 和未来的 TLS 版本可用时默认支持它们。

应使用新的默认协议,除非应用有特定原因而不能使用它们。 验证你的系统是否配置为仅允许安全协议。

若要禁用旧协议,请执行以下操作之一:

  • 参照 Windows 说明,在系统范围禁用旧的协议(如 TLS 1.0)。 目前所有 Windows 版本上都默认启用该协议。

  • 在代码中手动选择要支持的协议,如下所示:

    using System.Security.Authentication;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Hosting;
    
    public class Program
    {
        public static void Main(string[] args) =>
            CreateHostBuilder(args).Build().Run();
    
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseKestrel(kestrelOptions =>
                    {
                        kestrelOptions.ConfigureHttpsDefaults(httpsOptions =>
                        {
                            httpsOptions.SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls13;
                        });
                    });
    
                    webBuilder.UseStartup<Startup>();
                });
    }
    

遗憾的是,没有用于排除特定协议的 API。

受影响的 API

HttpsConnectionAdapterOptions.SslProtocols