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

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

此更改允许:

  • TLS 1.3 在支持 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