OpenSSLを使った通信をWiresharkでキャプチャする
OpenSSLのAPIを使って開発を行っていると、TLS通信の内容を確認したいことがあると思います。printfデバッグでもいいのですが、今回はWiresharkでキャプチャしたい場合の手順です。
ChromeやFireFoxでは起動時にSSLKEYLOGFILE環境変数を設定しておくことで、通信に関する鍵情報を指定ファイルに出力してくれるようになります。そのファイルをWiresharkから読み込ませることで、TLS通信も復号した状態で閲覧できるようになります。これと同じことを行います。
OpenSSLでは鍵情報をログするためのコールバックがずばりそのまま用意されているので、これを使います。SSL_CTX_set_keylog_callback()を使ってコールバックを設定すればSSLKEYLOGFILE環境変数と同様のことができます。
コールバックの設定
/* ctx is SSL_CTX * */ SSL_CTX_set_keylog_callback(ctx, keylog_callback);
コールバック本体
void keylog_callback(const SSL *ssl, const char *line) { FILE *fp; fp = fopen("keylog.log", "a"); if (fp == NULL) { fprintf(stderr, "Can't open keylog fil.\n"); return; } fprintf(fp, "%s\n", line); fclose(fp); }
コールバックのline引数には出力すべき鍵情報がフォーマット済みの状態で渡されてくるので、ファイルに出力するだけです。
出力される鍵情報の例
CLIENT_RANDOM 15e2f6578d97d1ccfbb935d725f9ec77479a5eeb0eeadac19366c5478c772353 0d3ad6da83cf81d3b582789177bcfe80a7c24b8dcd62248071fd8ee8298a4d793e38786e015b7f69e0079cdd4f8ddb47 CLIENT_RANDOM 3ea96a50211364e13182db68a37bba3036596ac1b851d26e72f684cca2091fe5 b6459c44d731f28f7c494096170b451e5f3f2ffd5d73653e85a0c61686d931c75b3efbc4f46edce92ab835ce19b3c0c8
あとはChromeの時と同じように、出力されるログファイルをWiresharkから読み込むように設定すれば、パケットを復号した状態で閲覧できるようになります。

[編集]メニューの[設定]からProtocols - TLSを選択。"(Pre)-Master-Secret log filename" にファイルを指定します。

暗号化されているデータが復号されているのが分かります(図2の例ではHTTP/2のフレームデータ)。
以前作ったHTTP/2の通信内容をダンプするツール https://github.com/kztomita/http-dump(*1) にも鍵情報を出力する--keylogオプションを追加しました。
(*1) 「簡単にHTTP/2通信を試す」参照
投稿日:2022/12/04 20:21