Kestrel: 互換性のない Windows バージョンでの TLS 経由の HTTP/2 の無効化

Windows で HTTP/2 over TLS (トランスポート層セキュリティ) を有効にするには、次の 2 つの要件を満たす必要があります。

  • アプリケーション層プロトコル ネゴシエーション (ALPN) のサポート。これは、Windows 8.1 および Windows Server 2012 R2 以降で使用できます。
  • HTTP/2 と互換性のある暗号のセット。これは、Windows 10 および Windows Server 2016 以降で使用できます。

そのため、HTTP/2 over TLS が構成されている場合の Kestrel の動作は、次のように変更されました。

  • Http1 にダウングレードし、ListenOptions.HttpProtocolsHttp1AndHttp2 に設定されている場合は、Information レベルでメッセージをログに記録します。 ListenOptions.HttpProtocols の既定値は Http1AndHttp2 です。
  • ListenOptions.HttpProtocolsHttp2 に設定されている場合は、NotSupportedException をスローします。

ディスカッションについては、イシュー dotnet/aspnetcore#23068 を参照してください。

導入されたバージョン

ASP.NET Core 5.0

以前の動作

次の表には、HTTP/2 over 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 over 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.EnableWindows81Http2true に設定して、これらのシナリオを有効にします。

変更理由

この変更によって、以前の Windows バージョンでの HTTP/2 TLS over TLS の互換性エラーができるだけ早い段階で明確に示されるようになります。

互換性のない Windows バージョンで HTTP/2 over TLS が無効になるようにします。 Windows 8.1 および Windows Server 2012 R2 は、既定で必要な暗号がないため、互換性はありません。 しかし、HTTP/2 と互換性のある暗号を使用するように、コンピューターの構成設定を更新することは可能です。 詳細については、「Windows 8.1 の TLS 暗号スイート」を参照してください。 構成が完了したら、アプリ コンテキスト スイッチ Microsoft.AspNetCore.Server.Kestrel.EnableWindows81Http2 を設定し、Kestrel で HTTP/2 over TLS を有効にする必要があります。 次に例を示します。

AppContext.SetSwitch("Microsoft.AspNetCore.Server.Kestrel.EnableWindows81Http2", true);

基になるサポートは変更されていません。 たとえば、Windows 8 や Windows Server 2012 で HTTP/2 over TLS が動作したことはありません。 この変更により、これらのサポートされていないシナリオでのエラーの表示方法が変わります。

影響を受ける API

なし