はじめに
HTTPS通信はTLSで暗号化されるので,パケットキャプチャしても暗号化前の通信は解読できません。ただ,HTTPS通信の中身をやっぱり見てみたくなることがあります。このような場合,共通鍵(セッション鍵)をcurlの機能で記録し,Wiresharkに共通鍵を認識させることで,TLS通信の内容を解読できます。
テスト環境
キャプチャ取得環境
- ubuntu22.04
- curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl/zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.14
- Wireshark 3.6.2 (Git v3.6.2 packaged as 3.6.2-2)
キャプチャ解析環境
- wireshark(Windows版4.0.7)
curlコマンド実行
- あらかじめ裏でWiresharkやtcpdumpを起動し,パケットキャプチャを開始します。
- SSLKEYLOGFILE環境変数に,共通鍵を保管するファイル名を設定してcurlコマンドを実行します。
$ SSLKEYLOGFILE=/path/to/key.log curl https://example.jp/
- パケットキャプチャを停止し,pcapng/pcapファイルとして保存します。
- SSLKEYLOGFILEで指定したパスに,key.logファイルが保存されたことを確認します。
WiresharkでTLSを復号
- pcapng/pcapファイルをWiresharkで開きます。この時点では,TLSで暗号化された通信は「Application Data」の状態で,内容は分かりません。
- SSLKEYLOGFILEファイル(key.log)を読み込ませます。「編集」→「設定」→左メニューの「Protcol」で「TLS」を選択。"(Pre)-Master-Secret log filename"の「参照」をクリックし,key.logを指定して「OK」します。
- Wiresharkの表示が,復号された状態に変わります。さきほどのNo15のパケットが,「TLSv1.3 Application Data」から「HTTP GET / HTTP/1.1」に変わり,通信内容を確認できるようになりました。
SSLKEYLOGFILEとは
SSLKEYLOGFILEとは,TLSで使用される秘密情報をロギングする機能とログフォーマットです。RFCにドラフト提出されていますが,残念ながらexpiredでした。ただ,Expiredにはなったもののcurl,chrome,Firefoxなどに実装されています。
注意事項
- 通常の利用でSSLKEYLOGFILE環境変数を有効にするのは危険なので避けてください。通信経路を盗聴される,かつ保存したファイルが漏えいすると,TLSでの暗号化通信が解読されてしまうからです。
参考文献
curl公式
The SSLKEYLOGFILE Format for TLS
Reading sniffed SSL/TLS traffic from curl with Wireshark
TLSの復号に用いる SSLKEYLOGFILE のフォーマット提案仕様
【Wireshark/Tshark】ブラウザのTLS通信をキャプチャ