Kestrel:在不兼容的 Windows 版本上通过 TLS 禁用 HTTP/2
要在 Windows 上启用基于传输层安全性 (TLS) 的 HTTP/2,需要满足以下两个要求:
- 应用层协议协商 (ALPN) 支持,从 Windows 8.1 和 Windows Server 2012 R2 开始提供。
- 与 HTTP/2 兼容的一组密码,从 Windows 10 和 Windows Server 2016 开始提供。
因此,配置基于 TLS 的 HTTP/2 时,Kestrel 的行为已更改为:
- 当 ListenOptions.HttpProtocols 设置为
Http1AndHttp2
时,降级到Http1
并记录Information
级别的消息。Http1AndHttp2
是ListenOptions.HttpProtocols
的默认值。 - 当
ListenOptions.HttpProtocols
设置为Http2
时,引发NotSupportedException
。
有关讨论,请参阅问题 dotnet/aspnetcore#23068。
引入的版本
ASP.NET Core 5.0
旧行为
下表概述了配置基于 TLS 的 HTTP/2 时的行为。
协议 | Windows 7、 Windows Server 2008 R2 或更早版本 |
Windows 8、 Windows Server 2012 |
Windows 8.1、 Windows Server 2012 R2 |
Windows 10、 Windows Server 2016 或更高版本 |
---|---|---|---|---|
Http2 |
引发 NotSupportedException |
TLS 握手期间出错 | TLS 握手期间出错 * | 无错误 |
Http1AndHttp2 |
降级到 Http1 |
降级到 Http1 |
TLS 握手期间出错 * | 无错误 |
* 配置兼容密码套件以支持这些方案。
新行为
下表概述了配置基于 TLS 的 HTTP/2 时的行为。
协议 | Windows 7、 Windows Server 2008 R2 或更早版本 |
Windows 8、 Windows Server 2012 |
Windows 8.1、 Windows Server 2012 R2 |
Windows 10、 Windows Server 2016 或更高版本 |
---|---|---|---|---|
Http2 |
引发 NotSupportedException |
引发 NotSupportedException |
引发 NotSupportedException ** |
无错误 |
Http1AndHttp2 |
降级到 Http1 |
降级到 Http1 |
降级到 Http1 ** |
无错误 |
** 配置兼容的密码套件并将应用上下文切换 Microsoft.AspNetCore.Server.Kestrel.EnableWindows81Http2
设置为 true
以启用这些方案。
更改原因
此更改可确保在较早的 Windows 版本上尽早、尽可能清晰地呈现基于 TLS 的 HTTP/2 的兼容性错误。
建议操作
确保在不兼容的 Windows 版本上禁用基于 TLS 的 HTTP/2。 Windows 8.1 和 Windows Server 2012 R2 是不兼容的,因为默认情况下它们缺少必要的密码。 但是,可以将“计算机配置”设置更新为使用 HTTP/2 兼容密码。 有关详细信息,请参阅 Windows 8.1 中的 TLS 密码套件。 配置完成后,必须通过设置应用上下文切换 Microsoft.AspNetCore.Server.Kestrel.EnableWindows81Http2
,在 Kestrel 上启用基于 TLS 的 HTTP/2。 例如:
AppContext.SetSwitch("Microsoft.AspNetCore.Server.Kestrel.EnableWindows81Http2", true);
未更改基础支持。 例如,基于 TLS 的 HTTP/2 在 Windows 8 或 Windows Server 2012 上始终无效。 此更改将修改这些不受支持的方案中错误的呈现方式。
受影响的 API
无