Upgrade to Pro — share decks privately, control downloads, hide ads and more …

QUIC の仕組み(Handshake)

Naoki MATSUMOTO
September 04, 2024
70

QUIC の仕組み(Handshake)

Naoki MATSUMOTO

September 04, 2024
Tweet

More Decks by Naoki MATSUMOTO

Transcript

  1. QUIC の仕組み QUIC: A UDP-Based Multiplexed and Secure Transport (RFC9000)

    • 1つの Connection 内に複数の Stream (Multiplexed) → HoL を排除 • 特殊な場合を除き、原則暗号化される (Secure) TCP と TLS で別々に行われていたハンドシェイク等をまとめて行う • UDP 上で QUIC 独自の輻輳制御や再送を行い信頼性を確保 (Transport) その他の特徴 • IP アドレスに依拠しない Connection の管理 → IP アドレスが変わっても接続が切れない • ユーザーライブラリとして実装される → 各自が自由に拡張・改良可能 ※ 相互接続性の保証が大変な気がする 1
  2. QUIC Packet, Frame • QUIC は1つのUDPパケットに複数の “QUIC Packet”を持つ • Initial

    Packet, Handshake Packet, 0-RTT Packet 等 • 各 Packet は Packet Number (PKN) を持つ • 各 QUIC Packet 内は複数の “QUIC Frame” を持つ • ACK Frame, PADDING Frame, CRYPTO Frame, STREAM Frame 等 → 無駄な UDP パケットや Round Trip の削減 UDP ペイロード QUIC Packet QUIC Packet QUIC Packet QUIC Frame QUIC Frame QUIC Frame QUIC Frame QUIC Frame QUIC Frame 2
  3. QUIC のハンドシェイク QUIC におけるハンドシェイクは2段階 Connection のハンドシェイク • 暗号(TLS ベース) やQUICに関するパラメータの交換

    • Connection ID の割り当て • 暗号化に利用するシークレットの導出 Streamのハンドシェイク • Connection 内でそれぞれ独立したデータチャネル(Stream) を確立 • Bi-directional, Uni-directional など種類がある 3
  4. QUIC ハンドシェイクの特徴 Packet の種類ごとに独立した PKN の空間を持つ • それぞれのハンドシェイクが独立している • それぞれ対応する

    Packet ごとに ACK を返す 1-RTT で Stream を確立しデータを流せる • 暗号のハンドシェイクと Stream の送信を同じ UDP パケットで行う • TCP + TLS (3-way + 1-RTT) より圧倒的に RTT の回数が少ない • Session Resumption の場合は 0-RTT で送ることも可能 5
  5. QUIC の暗号 QUIC では全ての Packet のペイロードが暗号化される • ヘッダ部は暗号化されないが、PKN は “Header

    Protection” で保護される • ペイロードの暗号化では、ヘッダの認証も同時に行われる RFC9000 Section 17.3.1. 1-RTT Packet より RFC9000 Section 17.2.4. Handshake Packet より 暗号化 暗号化 部分的に 保護 部分的に 保護 6
  6. QUIC Packet の暗号化・復号 QUIC Packet の暗号化・保護は2段階 • QUIC Header Protection

    による保護 → ヘッダの保護 • AEAD(認証付き暗号) による暗号化 → ペイロードの保護 Locked, Encrypted QUIC Packet Encrypted QUIC Packet Plain QUIC Packet Encrypted QUIC Packet Locked, Encrypted QUIC Packet Header Protection の解除 ペイロードの復号 ペイロードの暗号化 Header Protection で保護 7
  7. QUIC Header Protection PKN やヘッダのフラグを保護する • 暗号化された Payload を利用したマスクと XOR

    する → Middle Box 等による介入を抑止する RFC9001 Section 5.4.1. Header Protection Application より 8
  8. QUIC Header Protection マスクはシークレットから導出される鍵(HP key) で Payload を暗号化して導出する • マスクは

    AES-ECB を用いる場合と ChaCha20 を用いる場合がある 使い分けはハンドシェイクで選択される AEAD アルゴリズムに依る RFC9001 Section 5.4.1. Header Protection Application より RFC9001 Section 5.4.3. AES-Based Header Protection より RFC9001 Section 5.4.4. ChaCha20-Based Header Protection より 9
  9. 認証付き暗号(AEAD) Authenticated Encryption with Associated Data(AEAD) • データの機密性と完全性(正しさ)を担保する • 復号時に認証を行い、失敗すると復号失敗とする

    cipher, tag = AEAD_Enc(plain, ad, key, nonce) tag: 認証用のタグ, ad: 暗号化はされないが認証はされるデータ plain = AEAD_Dec(cipher, tag, ad, key, nonce) • QUIC では AES-GCM と Chacha20-Poly1305 が主に利用される 10
  10. 実際のハンドシェイク QUIC では QUIC Packet を最初から暗号化する 暗号部のハンドシェイクは TLS 1.3 +

    QUIC 拡張(RFC9001) Client Server InitialPacket(PKN=0) - CRYPTO Frame - Client Hello - DH 関連のパラメータ - QuicTransportParameters - SNI や ALPN 等 - PADDING Frame - パケットサイズが1200 bytes を超えるようにパディング InitialPacket は AES128GCM を用いて暗号化(RFC9001 Sec 5.1) 11
  11. Initial Secret Initial Packet は “Initial Secret” から導出された鍵を用いて暗号化 • QUIC

    のバージョンごとに指定される salt と クライアントから見た宛先 Connection ID を基に生成 • 宛先 Connection ID はこの時点ではクライアントはランダムに生成 • 生成した secret から更に、HKDF(RFC5869) を用いてlabel を “quic key”, “quic iv”, “quic hp” として鍵、初期ベクトル、Header Protection 用鍵を生成する ※ TLS 1.3 の鍵導出でラベルが変わっただけ • AEAD で利用する nonce は iv と PKN の XOR した結果を用いる(key はそのまま用いる) RFC 9001 Section 5.2. Initial Secrets 12
  12. 実際のハンドシェイク サーバーからの Initial Packet を受け取る 同時に Handshake Packet も受け取る NEW_CONNECTION_ID

    Frame を含む 1-RTT Packet を受け取ることもある Client Server InitialPacket(PKN=0) - ACK Frame - Largest Acked PKN=0 - PADDING Frame - CRYPTO Frame - Server Hello HandshakePacket(PKN=0) - CRYPTO Frame - Encrypted Extensions - Certificate - Certificate Verify - Finished TLS 1.3 と同じ 13
  13. Handshake Secret Handshake Packet は Handshake Secret から導出される鍵を用いる • Handshake

    Secret は TLS 1.3 における handshake secret と同じ = ClientHello, ServerHello から導出する • key, iv, hp 生成に利用するラベルは “quic key”, “quic iv”, “quic hp” RFC8446, Section 7.1 Key Schedule より アプリケーション用 ハンドシェイク用 14
  14. 実際のハンドシェイク InitialPacket(PKN=0) に対する ACK HandshakePacket(PKN=0) に対する ACK, Client Finished 必要に応じて

    STREAM Frame を 1-RTT Packet につめて送信 Client Server InitialPacket(PKN=1) - ACK Frame - Largest Acked PKN=0 HandshakePacket(PKN=1) - ACK Frame - Largest Acked PKN=0 - CRYPTO Frame - Finished 1-RTT Packet(PKN=0) - STREAM Frame - データ 15
  15. Application Secret STREAM Frame を含む 1-RTT Packet で用いる Secret •

    Application Secret は TLS 1.3 における application secret と同じ = CH, SH, EE, CT, CV, SV FIN から導出する • key, iv, hp 生成に利用するラベルは “quic key”, “quic iv”, “quic hp” • Key の Update が行われることがある • 新旧の鍵は Key Phase bit を用いて判断する • 双方ともに新しい鍵に移行したら、Update 完了 • 詳細は RFC9001 Section 6. Key Update を参照のこと 16