ASP.NET Core 5.0 Kestrel 服务器:不兼容 Windows 版本禁用 HTTP/2 over TLS 解析

ASP.NET Core 5.0 Kestrel 服务器:不兼容 Windows 版本禁用 HTTP/2 over TLS 解析

背景介绍

在 ASP.NET Core 5.0 中,Kestrel 服务器对 HTTP/2 over TLS 的支持行为发生了重要变化。HTTP/2 作为 HTTP/1.1 的升级版本,提供了多路复用、头部压缩等优化特性,但在某些 Windows 版本上存在兼容性问题。

技术原理

要在 Windows 上启用 HTTP/2 over TLS,必须满足两个关键条件:

  1. ALPN 支持:应用层协议协商(ALPN)功能,Windows 8.1 和 Windows Server 2012 R2 及以上版本才支持
  2. 兼容的加密套件:符合 HTTP/2 规范的加密套件,Windows 10 和 Windows Server 2016 及以上版本才完整支持

行为变化对比

旧版本行为

| 协议设置 | Windows 7/Server 2008 R2 及更早 | Windows 8/Server 2012 | Windows 8.1/Server 2012 R2 | Windows 10/Server 2016 及更新 | |----------------|--------------------------------|----------------------|--------------------------|----------------------------| | 仅 HTTP/2 | 抛出异常 | TLS 握手失败 | TLS 握手失败* | 正常工作 | | HTTP/1.1和HTTP/2 | 降级到 HTTP/1.1 | 降级到 HTTP/1.1 | TLS 握手失败* | 正常工作 |

*注:需配置兼容的加密套件才能支持

5.0 新行为

| 协议设置 | Windows 7/Server 2008 R2 及更早 | Windows 8/Server 2012 | Windows 8.1/Server 2012 R2 | Windows 10/Server 2016 及更新 | |----------------|--------------------------------|----------------------|--------------------------|----------------------------| | 仅 HTTP/2 | 抛出异常 | 抛出异常 | 抛出异常** | 正常工作 | | HTTP/1.1和HTTP/2 | 降级到 HTTP/1.1 | 降级到 HTTP/1.1 | 降级到 HTTP/1.1** | 正常工作 |

**注:需配置兼容加密套件并启用特殊开关才能支持

变更原因

这一变更主要是为了在不兼容的 Windows 版本上更早、更明确地暴露 HTTP/2 over TLS 的兼容性问题,避免开发者遇到难以诊断的 TLS 握手失败问题。

解决方案建议

  1. 对于不兼容的 Windows 版本:建议禁用 HTTP/2 over TLS
  2. Windows 8.1/Server 2012 R2
    • 首先配置兼容的加密套件(参考 Windows 官方文档)
    • 然后设置应用上下文开关启用支持:
AppContext.SetSwitch("Microsoft.AspNetCore.Server.Kestrel.EnableWindows81Http2", true);
  1. 注意:Windows 8/Server 2012 由于缺乏 ALPN 支持,无法使用 HTTP/2 over TLS

开发者注意事项

  1. 这项变更不会影响 HTTP/2 over 明文连接(非TLS)
  2. 对于必须使用 HTTP/2 over TLS 的场景,建议升级到 Windows 10/Server 2016 或更新版本
  3. 在开发环境中,可以使用 dotnet run 命令查看 Kestrel 的日志输出,它会明确提示 HTTP/2 兼容性问题

总结

ASP.NET Core 5.0 对 Kestrel 的 HTTP/2 over TLS 支持行为进行了合理化调整,使不兼容情况更加明确。开发者应根据目标运行环境选择合适的 HTTP 协议配置,确保应用在不同 Windows 版本上的兼容性。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值