有名なQUIC実装であるquic-goとQUICheについて書きます
環境
- Ubuntu 18.04
必要なもの
- パケットダンプ
- keylogファイル
- Wireshark
keylogファイルについて
通信時に利用したシークレットを書き出したものです。パケットの復号に利用します。各実装でこれを出力するための設定をする必要があります
quic-goで書き出すとこんな感じの内容になります。
CLIENT_HANDSHAKE_TRAFFIC_SECRET XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX SERVER_HANDSHAKE_TRAFFIC_SECRET XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX CLIENT_TRAFFIC_SECRET_0 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX SERVER_TRAFFIC_SECRET_0 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
QUIChe
log_keysメソッドを利用します。シークレットは環境変数SSLKEYLOGFILE
で指定したパスに保存されます。
examplesのクライアントでは次のように使われています。
let mut config = quiche::Config::new(version).unwrap(); // 中略 if std::env::var_os("SSLKEYLOGFILE").is_some() { config.log_keys(); }
quic-go
tls.Config
のKeyLogWriter
を利用します。次のようにするとkeylog.txt
に保存されます。
kl, err := os.OpenFile("keylog.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) if err != nil { return err } client = &http.Client{ Transport: &http3.RoundTripper{ TLSClientConfig: &tls.Config{ KeyLogWriter: kl, }, }, }
Wiresharkについて
最近のWiresharkでないとQUICに対応していないので注意が必要です。Tools · quicwg/base-drafts Wiki · GitHubにQUICのバージョンと、それに対応するWiresharkのバージョンに関する表があるので確認しておきます。
draft-24に対応するWiresharkをインストール
最新のQUIC実装を試したい場合、Wiresharkを手動でビルドする必要があります。頑張りましょう。ビルドするにあたりQtのdev libraryを入れる必要がありますがここに必要なものが書いてあります。
パケットを復号
Wiresharkのメニューから、Preference > Advanced > tls.keylog_fileに取得したkeylogファイルのパスを入力したのち、View > Reload で再読み込みするとQUICパケットのペイロードが読めるようになります。