quic-goを使った開発をするときのtips

go のQUICライブラリのquic-goを使った開発したときのtipsの備忘録です。

github.com

  1. Keylogファイルの書きだし方
  2. デバッグログの出力方法

についてメモしておきます。

Keylogファイルの書きだし方

↓で説明があるように、wiresharkでQUICの復号を行うためには、該当通信のKEYLOGファイルが必要になります。

asnokaze.hatenablog.com

quic-goでKeylogファイルを書きだすためには、quic.DialAddr を呼び出すときに、tls.Config に、KeylogWriterを持たせることで実現できます。

TLS ConfigにKeylogWriterを持たせる例は、goのdocumentから確認することができます

golang.org

例えば、以下のように実装すると、

   w, err := os.Create("./keylog.log")
    tlsConf := &tls.Config{
        InsecureSkipVerify: true,
        NextProtos:         []string{"hogehoge"},
        KeyLogWriter:       w,
    }

    config := &quic.Config{
        KeepAlive: true,
    }

    session, err := quic.DialAddr(addr, tlsConf, config)

keylog.logというファイルが生成されます。

中身は↓のようなフォーマットになっています。

CLIENT_HANDSHAKE_TRAFFIC_SECRET ... ...
SERVER_HANDSHAKE_TRAFFIC_SECRET ... ...
CLIENT_TRAFFIC_SECRET_0 ... ...
SERVER_TRAFFIC_SECRET_0 ... ...

logの出し方

github.com

環境変数 QUIC_GO_LOG_LEVEL=loglevel を設定して、プログラムを実行するとログの出力ができます。

例えば、QUIC_GO_LOG_LEVEL=debug と設定すると、QUICパケットの送信時に、QUICパケットとその内部に含まれるフレームのログが見たり

18:13:25.216025 client -> Sending packet 0x5 (26 bytes) for connection 0x39abd2c4bae665f6062f, 1-RTT
18:13:25.216028 client  Short Header{DestConnectionID: 0x0d76cf58, PacketNumber: 0x5, PacketNumberLen: 2, KeyPhase: 0}
18:13:25.216031 client  -> &wire.StreamFrame{StreamID: 6, FinBit: true, Offset: 0x15, Data length: 0x0, Offset + Data length: 0x15}

受信したQUICパケットを見たるすることが出来ます。

18:13:25.241739 client  Short Header{DestConnectionID: (empty), PacketNumber: 0x5, PacketNumberLen: 2, KeyPhase: 0}
18:13:25.241742 client  <- &wire.AckFrame{LargestAcked: 0x5, LowestAcked: 0x2, DelayTime: 25.504ms}

これ以外にも、接続シーケンスや切断したときの情報などを確認することが出来ます。

コードを動かして規格の中身を確認したいときに便利かもしれないです。