QUICプロトコルの解析 - Client Hello/Server Hello
QUICではTLS1.3による暗号化・認証 (AEAD; Authenticated Encryption with Additional Data) が採用されており、InitialメッセージではTLS1.3の暗号化・認証アルゴリズム合意(Client Hello/Server Hello)及び暗号化・認証に必要なKey情報(key_share)の交換が行われる。
TLS1.2までとは異なり、Client HelloにExtensionとしてkey_shareを設定し、Client Helloでのクライアントからのアルゴリズム提案と同時に必要なkey情報をServerに渡すことで、TLSハンドシェークの短縮を実現している。
今回はClient Hello / Server Helloシーケンス
QUICのClient Hello/Server Helloシーケンス
今回は、前回のInitialシーケンスの記事で紹介したシーケンスのうち、Initialシーケンスと同時に実施されるClient Helloシーケンスと、Initialシーケンスの後に実施されるServer Helloシーケンスについて。
Client Hello / Server Helloシーケンス
Client Hello / Server Helloシーケンスでは、Cryptoフレームを利用して暗号化アルゴリズムのネゴシエーションを実施する。
Client Hello
TLSのプロトコルバージョン、暗号化に用いるRandom Nonce、使用する暗号化スイートの候補、拡張(Extension)をサーバに通知する。
プロトコルバージョン
TLS1.3の場合、プロトコルバージョンは1.2(0x0303)を通知し、Extension ID=43 (Supported Version) でTLS1.3 (0x0304)を通知する。
暗号化スイート候補
暗号化スイート候補は以下のように複数のスイートを並べることができる。
Cipher Suites (3 suites) Cipher Suite: TLS_AES_128_GCM_SHA256 (0x1301) Cipher Suite: TLS_AES_256_GCM_SHA384 (0x1302) Cipher Suite: TLS_CHACHA20_POLY1305_SHA256 (0x1303)
上記の例では、以下のようなスイートが候補となっている。
- 認証付きAES128 GCMモード (ガロアカウンタモード) + SHA256ハッシュ
- 認証付きAES256 GCMモード (ガロアカウンタモード) + SHA384ハッシュ
- CHACHA20 POLY1305 + SHA256ハッシュ
拡張 (Extension)
ExtensionではRFC 8446 4.2章で定義されている拡張を含めることができる。代表的なものは以下の通り。 また、RFC 9001 8.2章で定義されるQUIC Transport Parametersを含める必要がある。
- Server Name (ID=0)
- Supported Groups (ID=10)
- ALPN; Application Layer Protocol Negotiation (ID=16)
- Key Share (ID=51)
- QUIC Transport Parameters (ID=65445 (draft 13))
Key Shareの例
Extension: key_share (len=38) Type: key_share (51) Length: 38 Key Share extension Client Key Share Length: 36 Key Share Entry: Group: x25519, Key Exchange length: 32 Group: x25519 (29) Key Exchange Length: 32 Key Exchange: 5f3994e8d5ea48bc37bde49a8311046d105b92782673022e3d7a145e00908d78
Server Hello
Client Helloを受け、サーバ側が受け入れるバージョンとKey ShareをPacket Type = InitialのCRYPTOフレームで送信する。 Server Helloを送信するパケットではPacket Type = HandshakeのCRYPTOフレームも連結して送信するが、Handshakeフレームについては後述。
以下の例では、Client Helloでクライアントから提案されたTLS 1.3で鍵交換はECDHE X25519に対して、同じ値でServer Helloが応答していることからサーバはクライアント提案のTLS 1.3 / ECDHE X25519を受け入れることを示している。
Key Exchangeでサーバが応答する値は、サーバ側の公開鍵QBである。
サーバ側はQAと楕円曲線X25519で定義される有限体K、曲線を決定する3次式、ベースポイントG、その位数nなどのパラメータに従ってクライアント側の秘密鍵dBを計算する。 クライアント側はQBと楕円曲線X25519で定義されるパラメータに従ってサーバ側の秘密鍵dAを計算する。
Extension: key_share (len=38) Type: key_share (51) Length: 38 Key Share extension Client Key Share Length: 36 Key Share Entry: Group: x25519, Key Exchange length: 32 Group: x25519 (29) Key Exchange Length: 32 Key Exchange: 5f3994e8d5ea48bc37bde49a8311046d105b92782673022e3d7a145e00908d78 Extension: supported_versions (len=2) Type: supported_versions (43) Length: 2 Supported Version: TLS 1.3 (0x0304)