Kestrel: HTTP/2 отключен по протоколу TLS в несовместимых версиях Windows
Чтобы включить HTTP/2 по TLS в Windows, необходимо выполнить два условия:
- поддержка согласования протокола уровня приложений доступна, начиная с Windows 8.1 и Windows Server 2012 R2;
- набор шифров, совместимых с HTTP/2, доступен, начиная с Windows 10 и Windows Server 2016.
Таким образом, поведение Kestrel при настройке HTTP/2 по протоколу TLS изменилось следующим образом:
- Переход на использование более ранней версии
Http1
и регистрация сообщения в журнале на уровнеInformation
, если ListenOptions.HttpProtocols имеет значениеHttp1AndHttp2
. ЗначениеListenOptions.HttpProtocols
по умолчанию —Http1AndHttp2
. - Выводится
NotSupportedException
, еслиListenOptions.HttpProtocols
имеет значениеHttp2
.
Обсуждение этого вопроса см. на странице dotnet/aspnetcore#23068.
Представленные версии
ASP.NET Core 5.0
Старое поведение
В следующей таблице показано поведение при настройке HTTP/2 по TLS.
Протоколы | 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 * | Без ошибок |
* Настройте совместимые наборы шифров для включения этих сценариев.
Новое поведение
В следующей таблице показано поведение при настройке HTTP/2 по TLS.
Протоколы | 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
включить эти сценарии.
Причина изменения
Это изменение гарантирует, что ошибки совместимости для HTTP/2 по TLS в более старых версиях Windows отображаются как можно раньше и точнее.
Рекомендуемое действие
Необходимо обеспечить отключение HTTP/2 по TLS в несовместимых версиях Windows. Windows 8.1 и Windows Server 2012 R2 несовместимы, так как по умолчанию в них отсутствуют необходимые шифры. Однако можно обновить параметры конфигурации компьютера для использования шифров, совместимых с HTTP/2. Дополнительные сведения см. в разделе Комплекты шифров TLS в Windows 8.1. После настройки необходимо включить HTTP/2 по TLS в Kestrel путем настройки параметра контекста приложения Microsoft.AspNetCore.Server.Kestrel.EnableWindows81Http2
. Например:
AppContext.SetSwitch("Microsoft.AspNetCore.Server.Kestrel.EnableWindows81Http2", true);
Основная поддержка не изменилась. Например, HTTP/2 по TLS никогда не поддерживался в Windows 8 и Windows Server 2012. В результате этого изменения меняется представление ошибок в этих неподдерживаемых сценариях.
Затронутые API
Нет