go のQUICライブラリのquic-goを使った開発したときのtipsの備忘録です。
- Keylogファイルの書きだし方
- デバッグログの出力方法
についてメモしておきます。
Keylogファイルの書きだし方
↓で説明があるように、wiresharkでQUICの復号を行うためには、該当通信のKEYLOGファイルが必要になります。
quic-goでKeylogファイルを書きだすためには、quic.DialAddr
を呼び出すときに、tls.Config
に、KeylogWriterを持たせることで実現できます。
TLS ConfigにKeylogWriterを持たせる例は、goのdocumentから確認することができます
例えば、以下のように実装すると、
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の出し方
環境変数 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}
これ以外にも、接続シーケンスや切断したときの情報などを確認することが出来ます。
コードを動かして規格の中身を確認したいときに便利かもしれないです。