8. TLSハンドシェイクへのQUIC固有の調整 (QUIC-Specific Adjustments to the TLS Handshake)
QUICと共に使用される場合、TLSハンドシェイクのいくつかの側面が異なります。
QUICはまた、暗号化ハンドシェイクがセキュリティとパフォーマンスの両方にとって重要なパラメータの認証されたネゴシエーションを提供することを要求します。暗号化パラメータのネゴシエーションに加えて、TLSハンドシェイクはQUICトランスポートパラメータの値も転送および検証します。
8.1. プロトコルネゴシエーション (Protocol Negotiation)
QUICは、暗号化ハンドシェイクがプロトコルネゴシエーションの認証を提供することを要求します。TLSはアプリケーション層プロトコルネゴシエーション(ALPN)[ALPN]を使用してアプリケーションプロトコルを選択します。アプリケーションプロトコルを合意するために別のメカニズムが使用されない限り、エンドポイントはこの目的でALPNを使用しなければなりません(MUST)。
ALPNを使用する場合、アプリケーションプロトコルがネゴシエートされない場合、エンドポイントはno_application_protocol TLSアラート(QUICエラーコード0x0178;セクション4.8を参照)を使用して直ちに接続を閉じなければなりません(MUST)([QUIC-TRANSPORT]のセクション10.2を参照)。[ALPN]は、このアラートを使用するのはサーバーのみであると指定していますが、QUICクライアントはALPNネゴシエーションが失敗したときに接続を終了するためにエラー0x0178を使用しなければなりません(MUST)。
アプリケーションプロトコルは、使用できるQUICバージョンを制限することができます(MAY)。サーバーは、クライアントが選択したQUICバージョンと互換性のあるアプリケーションプロトコルを選択しなければなりません(MUST)。サーバーは、互換性のあるアプリケーションプロトコルを選択できない場合を、タイプ0x0178(no_application_protocol)の接続エラーとして扱わなければなりません(MUST)。同様に、クライアントは、サーバーが互換性のないアプリケーションプロトコルを選択した場合を、タイプ0x0178の接続エラーとして扱わなければなりません(MUST)。
8.2. QUICトランスポートパラメータ拡張 (QUIC Transport Parameters Extension)
QUICトランスポートパラメータはTLS拡張で転送されます。QUICの異なるバージョンは、トランスポート構成をネゴシエートするための異なる方法を定義する可能性があります。
TLSハンドシェイクにトランスポートパラメータを含めることで、これらの値の完全性保護が提供されます。
enum {
quic_transport_parameters(0x39), (65535)
} ExtensionType;
quic_transport_parameters拡張のextension_dataフィールドには、使用されているQUICバージョンによって定義された値が含まれます。
quic_transport_parameters拡張は、ハンドシェイク中のClientHelloおよびEncryptedExtensionsメッセージで転送されます。エンドポイントはquic_transport_parameters拡張を送信しなければなりません(MUST)。quic_transport_parameters拡張のないClientHelloまたはEncryptedExtensionsを受信したエンドポイントは、タイプ0x016dのエラーで接続を閉じなければなりません(MUST)(TLS致命的アラートmissing_extensionと同等;セクション4.8を参照)。
トランスポートパラメータは、ハンドシェイクが完了する前に利用可能になります。サーバーは、ハンドシェイクが完了する前にこれらの値を使用できます。ただし、ハンドシェイクが完了するまでトランスポートパラメータ値は認証されないため、これらのパラメータの使用はその真正性に依存できません。トランスポートパラメータの改ざんはハンドシェイクの失敗につながります。
エンドポイントは、QUICを使用しないTLS接続([TLS13]で定義されているTCP上のTLSの使用など)でこの拡張を送信してはなりません(MUST NOT)。この拡張をサポートする実装は、トランスポートがQUICでない場合にこの拡張を受信したときに、unsupported_extension致命的アラートを送信しなければなりません(MUST)。
quic_transport_parameters拡張のネゴシエーションにより、EndOfEarlyDataが削除されます(セクション8.3を参照)。
8.3. EndOfEarlyDataメッセージの削除 (Removing the EndOfEarlyData Message)
TLS EndOfEarlyDataメッセージはQUICで使用されません。QUICは、0-RTTデータの終了をマークしたり、ハンドシェイク鍵への切り替えを通知したりするためにこのメッセージに依存しません。
クライアントはEndOfEarlyDataメッセージを送信してはなりません(MUST NOT)。サーバーは、0-RTTデータパケットでCRYPTOフレームを受信した場合を、タイプPROTOCOL_VIOLATIONの接続エラーとして扱わなければなりません(MUST)。
その結果、EndOfEarlyDataはTLSハンドシェイクトランスクリプトに表示されません。
8.4. TLSミドルボックス互換モードの禁止 (Prohibiting TLS Middlebox Compatibility Mode)
[TLS13]の付録D.4は、一部のミドルボックスのバグに対する回避策として、TLS 1.3ハンドシェイクへの変更について説明しています。TLS 1.3ミドルボックス互換モードには、ClientHelloとServerHelloのlegacy_session_idフィールドを32バイトの値に設定し、change_cipher_specレコードを送信することが含まれます。フィールドもレコードもセマンティックコンテンツを持たず、無視されます。
このモードは、TCP上のTLSに干渉するミドルボックスにのみ適用されるため、QUICでは役に立ちません。QUICはchange_cipher_specレコードを転送する手段さえ提供しません。クライアントはTLS 1.3互換モードの使用を要求してはなりません(MUST NOT)。サーバーは、空でないlegacy_session_idフィールドを持つTLS ClientHelloの受信を、タイプPROTOCOL_VIOLATIONの接続エラーとして扱うべきです(SHOULD)。