Introduction
備忘録。
How to do?
Wireshark で TLS の通信を復号する方法は 2 つある
- サーバの秘密鍵を登録する方法で復号
- Pre-Maser Secretを登録する方法で復号
このうち、前者は非推奨の方法になっている。
理由として
- 鍵交換のアルゴリズムはDH系 (DHEやECDH含む) ではないこと
- SSL3.0、(D)TLS1.0-1.2のみサポート
等の理由があるため。
実際、目的のサーバの通信における鍵交換アルゴリズムを確認してみたら TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 となっていた。
暗号方式自体は RSA だが鍵交換アルゴリズムが ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) であるためこの方式は使えない。
なので、後者の方法で復号化を試す。
手順としては
- Pre-Maser Secret の生成
- Pre-Maser Secret を使って Wireshark で通信をキャプチャ
となる
Pre-Maser Secret の生成
Pre-Maser Secret は RFC 5246 (TLS 1.2) で定義されている TLS/SSLの安全なセッション鍵を作るための中間データとなる。
この Pre-Maser Secret を Wireshark でキャプチャする前にブラウザで目的のサーバと通信をすることでファイルに書き出す。
下記のようにすれば生成が可能。
なお、以降の事例は全て自己署名証明書で実行している。
1 | $ set SSLKEYLOGFILE=f:\tls_key.log |
ポイントは、全てのブラウザのプロセスを終了しておくこと。
既にブラウザが立ち上がっている状態で SSLKEYLOGFILE
を設定し、新しいインスタンスを起動しても意味がない。
curl
でも問題なく使える (Windows の場合は組み込みのではなく、公式サイト curl からダウンロードしたものを使うべき)。
1 | $ set SSLKEYLOGFILE=f:\tls_key.log |
どちらの点でも SSLKEYLOGFILE
で指定したパスに Pre-Maser Secret が出力されている。
また、環境変数に設定するのではなく、シェル変数に設定したほうがセキュリティの面でも安心。
Pre-Maser Secret を使って Wireshark で通信をキャプチャ
先程出力された Pre-Maser Secret を設定する。
編集 -> 設定 から、左メニューの Protcol で TLS を選択。
**(Pre)-Master-Secret log filename** に先程の SSLKEYLOGFILE
で指定したファイルを入力し OK を押下。
続いてキャプチャを開始する。
ブラウザでも curl でも、目的のサーバに対して通信を行う。
TSL の復号化が行われ、従来 Protocol が TLSv1.2 だったりした箇所が、 HTTP2 になっていることがわかる。
実際は、 HTTP2 になるかは環境次第だが (今回は ASP.NET で構築したサーバを使っている)。
詳細を見ると、通信内容が復号化されていることがわかる。
下記は Pre-Maser Secret を設定していない 状態のキャプチャ内容。