インターネット上の通信において暗号化が標準となった現代では、多くのトラフィックがHTTPS(HTTP over TLS/SSL)によって保護されています。
ネットワークトラブルの調査やマルウェアの挙動分析、アプリケーションのデバッグなどにおいて、暗号化された通信の中身を確認しなければならない場面は少なくありません。
Wiresharkなどのパケットキャプチャツールをそのまま使用しただけでは、暗号化されたデータは判読不能な文字列として表示されます。
本記事では、SSLKEYLOGFILEという仕組みを利用して、WiresharkでHTTPS通信をリアルタイムに復号し、その中身を詳細に解析するための具体的な手順について解説します。
HTTPS復号の必要性と従来の課題
ネットワークセキュリティの向上に伴い、Webサイトの閲覧やAPI連携のほとんどがHTTPSで行われるようになりました。
HTTPSはTLS(Transport Layer Security)プロトコルを使用してデータを暗号化し、第三者による盗聴や改ざんを防止します。
しかし、正当な管理者がシステムの問題を特定する場合や、社内ネットワークでの不正通信を検知する場合には、この暗号化が解析の障壁となります。
かつては、サーバー側の秘密鍵をWiresharkに登録することで通信を復号する手法が一般的に用いられていました。
しかし、現代の主流であるTLS 1.2(一部の暗号スイート)やTLS 1.3では、PFS(Perfect Forward Secrecy)という仕組みが導入されています。
PFSが有効な通信では、万が一サーバーの秘密鍵が漏洩しても、過去の通信データを遡って復号することはできません。
そのため、サーバーの秘密鍵をWiresharkに読み込ませる従来の手法では、現代のセキュアな通信を解析することは不可能となっています。
そこで重要となるのが、通信セッションごとに生成される「一時的な共通鍵」を直接利用する手法です。
SSLKEYLOGFILEとは何か
SSLKEYLOGFILEとは、WebブラウザやアプリケーションがTLS通信を行う際に使用するセッション鍵を、外部ファイルに書き出すための環境変数の仕組みを指します。
Google ChromeやMozilla Firefox、Microsoft Edgeなどの主要なブラウザはこの仕組みをサポートしています。
ブラウザが生成したセッション鍵をテキストファイルとして保存し、それをWiresharkが読み込むことで、秘密鍵なしでPFS対応の通信を復号することが可能になります。
この手法の最大の利点は、サーバー側の設定変更を一切必要とせず、クライアント側の設定のみで解析が完結する点にあります。
また、TLS 1.3という最新のプロトコルにおいても、この方式を用いることで確実にペイロード(データ本体)を確認できます。
事前準備:環境の構築
HTTPS通信の復号を開始する前に、必要なツールと環境を整える必要があります。
まずは、最新バージョンのWiresharkがインストールされていることを確認してください。
Wiresharkのバージョンが古いと、TLS 1.3の復号に完全対応していない可能性があるため、常に最新版を利用することが推奨されます。
次に、セッション鍵を保存するための空のテキストファイルをあらかじめ作成しておくとスムーズです。
Windows環境であれば、C:\temp\sslkeys.logといった分かりやすいパスにファイルを配置することをお勧めします。
このファイルには、ブラウザが通信を行うたびに秘匿性の高い鍵情報が書き込まれることになります。
ステップ1:環境変数の設定(Windowsの場合)
ブラウザに対して鍵情報の出力を指示するために、OSの環境変数を設定します。
Windowsの検索バーに「環境変数」と入力し、「システム環境変数の編集」を選択してください。
表示されたウィンドウの「詳細設定」タブにある「環境変数」ボタンをクリックします。
「ユーザー環境変数」のセクションで「新規」をクリックし、以下の情報を入力します。
| 項目 | 設定値 |
|---|---|
| 変数名 | SSLKEYLOGFILE |
| 変数値 | C:\temp\sslkeys.log(先ほど作成したファイルのパス) |
「OK」をクリックして設定を保存した後は、開いているブラウザをすべて完全に終了させる必要があります。
ブラウザがバックグラウンドで動作している場合、新しい環境変数が反映されないため、タスクマネージャー等でプロセスが残っていないか確認してください。
ステップ2:ブラウザの起動と鍵出力の確認
環境変数の設定後、ブラウザを起動して適当なHTTPSサイト(例:google.comなど)にアクセスします。
アクセス後、指定したパスにあるsslkeys.logファイルをテキストエディタで開いてみてください。
CLIENT_HANDSHAKE_TRAFFIC_SECRET ...
CLIENT_TRAFFIC_SECRET_0 ...
SERVER_TRAFFIC_SECRET_0 ...
EXPORTER_SECRET ...
上記のような「CLIENT_RANDOM」で始まる、あるいはTLS 1.3形式のシークレット情報が書き込まれていれば成功です。
もしファイルが空のままである場合は、環境変数の綴りが間違っていないか、あるいはブラウザの再起動が不十分でないかを確認してください。
ステップ3:Wiresharkへの鍵ファイル設定
次に、Wiresharkが先ほどのログファイルを参照して通信をリアルタイムに復号するように設定します。
Wiresharkを起動し、上部メニューの「編集 (Edit)」から「設定 (Preferences)」を選択してください。
設定ウィンドウの左側にあるリストから「Protocols」を展開し、その中から「TLS」を探して選択します。
なお、古いバージョンのWiresharkでは「SSL」という名称になっている場合があります。
TLSの設定画面の中に、「(Pre)-Master-Secret log filename」という項目があります。
その右側にある「Browse」ボタンをクリックし、先ほど作成したsslkeys.logを選択してください。
「OK」をクリックして設定を適用すれば、Wireshark側の準備は完了です。
ステップ4:キャプチャの実行と復号の確認
準備が整ったら、パケットキャプチャを開始します。
Wiresharkで対象のネットワークインターフェースを選択し、キャプチャをスタートさせてください。
ブラウザで任意のWebサイトにアクセスし、Wiresharkの画面にパケットが流れるのを確認します。
この時点では、パケット一覧には「TLS」や「Application Data」と表示されています。
ここで、特定のTLSパケットを選択し、画面下部のパケット詳細ペインを確認してください。
「Decrypted TLS」というタブが表示されていれば、正常に復号が行われています。
また、プロトコル列に「HTTP」や「HTTP2」といった表示が現れれば、暗号化の壁を越えてアプリケーションレイヤーの内容が見えている証拠です。
解析のテクニック:特定の通信を絞り込む
HTTPS通信を復号すると膨大なデータが表示されるため、効率的なフィルタリングが不可欠です。
例えば、特定のドメインへのリクエストだけを確認したい場合は、表示フィルタにhttp.host == "example.com"と入力します。
HTTP/2が使用されている場合は、http2というフィルタを使用することで、バイナリ形式のフレーム構造を分かりやすく解析できます。
特定の文字列がレスポンスに含まれているかを探すには、frame contains "password"といったフィルタも有効です。
「Decrypted TLS」タブが表示されない場合は、TLSハンドシェイクの最初のパケット(Client Hello)からキャプチャできているかを確認してください。
セッションの途中からキャプチャを開始したパケットは、鍵情報があっても復号できないことがあるため、キャプチャを開始してからブラウザでページをリロードするのがコツです。
セキュリティ上の重要な注意点
SSLKEYLOGFILEを用いた解析は非常に強力ですが、取り扱いには細心の注意を払う必要があります。
作成されたログファイルには、その端末で行ったすべてのHTTPS通信を復号できる鍵が含まれています。
これには、オンラインバンキングのパスワード、SNSのセッションクッキー、個人情報などが含まれる可能性があります。
解析作業が終わったら、必ず環境変数を削除し、ログファイルを物理的に削除することを強く推奨します。
また、マルチユーザーで使用している共有PCや、公共の端末でこの設定を行うことは極めて危険です。
あくまで自身の管理下にある検証環境において、必要な時のみ一時的に有効にするようにしてください。
Linux環境での実行方法
サーバーサイドの調査などでLinux環境を利用している場合も、同様の手法が使えます。
コマンドラインからブラウザを起動する際に、一時的に環境変数を付与するのが最も安全な方法です。
# SSLKEYLOGFILEを指定してFirefoxを起動する例
export SSLKEYLOGFILE=~/sslkeys.log
firefox &
このように実行することで、そのセッション中のみ鍵情報がファイルに書き出されます。
WiresharkをGUIで動かしている場合は、Windows版と同様の手順でプロトコル設定からファイルを選択してください。
CLI版のtsharkを使用する場合は、以下のコマンドラインオプションで鍵ファイルを指定できます。
# tsharkで鍵ファイルを指定してリアルタイム解析
tshark -o "tls.keylog_file: ~/sslkeys.log" -Y "http"
TLS 1.3における復号の差異
TLS 1.2とTLS 1.3では、復号のプロセスにおいてWireshark内部での処理が若干異なります。
TLS 1.3ではハンドシェイク自体も一部暗号化されているため、鍵ファイルがない状態では証明書の詳細すら確認できない場合があります。
SSLKEYLOGFILEを使用すれば、TLS 1.3の「Encrypted Extensions」や「Certificate」メッセージも平文として表示されるようになります。
これにより、SNI(Server Name Indication)以外の拡張情報も詳細に検証することが可能となります。
よくあるトラブルシューティング
設定を正しく行ったつもりでも、復号できないケースがいくつか存在します。
一つは、ブラウザ以外のアプリケーションが独自のTLSライブラリを使用しており、SSLKEYLOGFILE環境変数を無視する場合です。
多くのアプリケーションはOS標準のライブラリやOpenSSLを利用しますが、静的にリンクされた独自のスタックを持つソフトウェアにはこの手法は通用しません。
もう一つは、HSTS(HTTP Strict Transport Security)や証明書ピン留め(Certificate Pinning)の影響です。
ただし、SSLKEYLOGFILEは通信路を曲げる「プロキシ方式」ではないため、基本的にはピン留めの影響を受けずに解析可能です。
もし全く復号されない場合は、Wiresharkの「プロトコル」設定で「TLS」ではなく「UDP」の下にある「QUIC」の設定を確認する必要があるかもしれません。
最近のGoogle関連サービスでは、TCPベースのTLSではなくUDPベースのQUICプロトコルが使用されることが多いからです。
QUICの復号も、TLSと同様に「(Pre)-Master-Secret log filename」に鍵ファイルを指定することで対応可能です。
まとめ
WiresharkとSSLKEYLOGFILEを組み合わせた解析手法は、現代の暗号化されたネットワーク環境において不可欠なスキルです。
PFSが標準となった現在のTLS通信であっても、この方法を用いれば確実にパケットのペイロードまで到達することができます。
環境変数の設定、ブラウザの再起動、Wiresharkへのパス指定という3つのステップを正しく踏むことが、スムーズな解析の鍵となります。
一方で、鍵情報の取り扱いには厳重な注意が必要であり、検証が終わった後の後処理を忘れてはいけません。
この手法をマスターすることで、トラブルシューティングやセキュリティ分析の精度は飛躍的に向上するでしょう。
本記事で紹介した手順を参考に、安全かつ効率的なパケット解析を実践してください。
