Wireshark・tsharkでHTTPS通信を復号
*本記事はUbuntu 18.04LTSでの設定を想定しています
HTTPS通信ではWebサイトとWebブラウザでやり取りする情報が暗号化されています。ただパケットキャプチャしただけでは暗号化された情報を見れず、別途設定が必要です。
クライアント側でのHTTPS通信の復号
クライアント側PCでのパケットキャプチャでHTTPS通信を復号するには以下の方法があります。
- サーバ側の秘密鍵を使う
- クライアント側のセッション鍵を使う
おおざっぱな説明になりますが、HTTPSでは公開鍵暗号方式を用いてサーバ側とクライアント側で情報を交換して共通鍵を作成し、その共通鍵で通信データを暗号化・復号します。1の「サーバ側の秘密鍵」とは公開鍵暗号方式で用いる秘密鍵のこと、2の「セッション鍵」は共通鍵を作るための情報のことです。
1の方法は、秘密鍵をあらかじめWiresharkに登録する必要があり、自分が管理している(秘密鍵を知っている)サーバとの通信でしか使えません。2の方法の場合、セッション鍵をWiresharkに登録し通信データを復号します。セッション鍵はブラウザから出力させることができるので、他人が管理するサーバとのHTTPS通信でも復号できます。以下では2の方法についてのみ記述します。
セッション鍵の取得方法
ブラウザは環境変数SSLKEYLOGFILEで指定した出力先にセッション鍵を出力します。環境変数を設定後、ブラウザでHTTPS対応のWebサイトにアクセスすれば自動的にセッション鍵が書き出されます。その状態でパケットキャプチャを行えば、キャプチャした通信がHTTPS通信であってもセッション鍵を使って復号できます。
環境変数はexportコマンドを使うことで設定できます。以下では「/var/log/tls_key.log」にセッション鍵が出力されます。
$ export SSLKEYLOGFILE=/home/muknow/tls_key.log
ターミナルでexportコマンドを実行した場合、設定した環境変数はそのターミナルでのみ有効となります。そのため、ブラウザ(下記コマンドではFirefox)を同一のターミナルから起動しなければセッション鍵は出力されません。
$ export SSLKEYLOGFILE=/home/muknow/tls_key.log $ firefox &
システム全体で環境変数を有効にしたい場合は「~/.profile」に先ほどのexportコマンドを記述します。設定の反映はsourceコマンドでします。(sourceコマンドを使わなくても再起動すれば設定は反映されます)
$ echo 'export SSLKEYLOGFILE=/home/muknow/tls_key.log' >> ~/.profile $ source ~/.profile
セッション鍵を使った復号(tsharkの場合)
tsharkはWireshakのコマンドラインツールです。pcapファイルの解析を自動化したい場合などに役立ちます。
セッション鍵を読み込む場合は-oオプションでssl.keylog_fileにセッション鍵が記録されたファイルを指定します。
$ tshark -r test.pcap -o "ssl.keylog_file: /home/muknow/tls_key.log"
実際に復号が成功したか確認する際は、-YオプションでHTTPもしくはHTTP2の通信だけを表示するようにし、セッション鍵を読み込まない場合との差分を見るとよいです。
$ tshark -r test.pcap -Y "http or http2" > no_dec.txt $ tshark -r test.pcap -Y "http or http2" -o "ssl.keylog_file: /home/muknow/tls_key.log" > dec.txt $ diff no_dec.txt dec.txt