電気ひつじ牧場

技術メモ

WiresharkでQUICパケットを復号化して眺める

有名なQUIC実装であるquic-goQUICheについて書きます

環境

必要なもの

  • パケットダンプ
  • 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.ConfigKeyLogWriterを利用します。次のようにすると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パケットのペイロードが読めるようになります。

参考

WiresharkでのQUICの復号(decrypt) - ASnoKaze blog