Wiresharkパケット解析メモ

Wiresharkでパケット解析

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シーケンス

f:id:packet_analysis:20210808230519p:plain
QUICの1-RTT Handshakeシーケンス

今回は、前回の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)
    • 鍵共有の方法を通知。例えばECDHE(エフェメラ楕円曲線ディフィーヘルマン鍵共有)で楕円曲線X25519を利用する場合はGroup id=29と共有鍵QAを送信する。
  • QUIC Transport Parameters (ID=65445 (draft 13))
    • タイムアウト時間やペイロードサイズなど、データ転送に使うためのパラメータ一式を定義する。設定しない場合はQUICコネクション切断となる。

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)