QUICプロトコルの解析 - パケットキャプチャ
はじめに
QUICプロトコルは2021年5月にRFC 9000で標準化されたプロトコル。HTTP/3と併せて使うことが想定されている。
UDPベースのトランスポートを提供しており、データに加えてヘッダも暗号化されて伝送されるため、従来のTCPのようなシーケンス番号による解析が難しくなっている。
QUICのパケットキャプチャ
nginxが用意しているQUICのテスト環境を使ってパケットキャプチャしてみる。 テストの環境は以下の通り
- macOS Big Sur 11.5
- Google Chrome 92.0.4515.107
- Wireshark 3.4.6
Google ChromeをTLS pre-master-secret取得モードで起動
QUICはTLSで暗号化がかかるため、Google ChromeをTLSのpre-master-secretを取得できるようにして起動する。
SSLKEYLOGFIKE=
でファイル名を指定して起動させることで、指定したファイルにTLS復号のためのpre-master-secretが保存される。
% SSLKEYLOGFILE=~/Capture/pre-master-secret.log "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
ChromeのQUICサポートを明示的に有効にする
起動したChromeでchrome://flags
にアクセスし、実験的なQUICプロトコルのサポートと、DNSでのHTTPSSVCレコードのサポートを有効にしておく。
nginxのQUICテスト環境へのアクセス
Wiresharkでパケットキャプチャを開始したのち、nginxが用意しているQUICのテスト環境にアクセスし、TestをRunする。 QUICでアクセスできたセッションは緑色で表示される。
WiresharkでのQUICの見え方
InitialとHandshakeの1パケット目まではTLS1.3のネゴシエーション前のため、ヘッダが平文で見える。
Handshakeの2パケット目以降はTLS1.3のネゴシエーションが完了するため、ヘッダ以降が全てTLS暗号化される。
WiresharkでのTLSのデコード
Preference->Protocols->TLSからSSLKEYLOGFILEで指定したpre-master-secretのファイルを指定する。
pre-master-secretを指定することで、Packet NumberやPayloadなどを復号してみることができるようになる。
おわりに
今回はQUICパケットのキャプチャとTLSの復号までを試してみました。