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 となっていた。

wireshark_cipher_suite

暗号方式自体は RSA だが鍵交換アルゴリズムが ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) であるためこの方式は使えない。

なので、後者の方法で復号化を試す。

手順としては

  1. Pre-Maser Secret の生成
  2. Pre-Maser Secret を使って Wireshark で通信をキャプチャ

となる

Pre-Maser Secret の生成

Pre-Maser Secret は RFC 5246 (TLS 1.2) で定義されている TLS/SSLの安全なセッション鍵を作るための中間データとなる。
この Pre-Maser Secret を Wireshark でキャプチャする前にブラウザで目的のサーバと通信をすることでファイルに書き出す。

下記のようにすれば生成が可能。
なお、以降の事例は全て自己署名証明書で実行している。

1
2
3
$ set SSLKEYLOGFILE=f:\tls_key.log
$ taskkill /f /im msedge.exe
$ "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://192.168.11.100

ポイントは、全てのブラウザのプロセスを終了しておくこと。
既にブラウザが立ち上がっている状態で SSLKEYLOGFILE を設定し、新しいインスタンスを起動しても意味がない。

curl でも問題なく使える (Windows の場合は組み込みのではなく、公式サイト curl からダウンロードしたものを使うべき)。

1
2
$ set SSLKEYLOGFILE=f:\tls_key.log
$ "F:\curl-8.12.1_4-win64-mingw\curl-8.12.1_4-win64-mingw\bin\curl.exe" -X "GET" "https://192.168.11.100/api/getMessage" -H "accept: application/json" --cacert ca.crt

どちらの点でも SSLKEYLOGFILE で指定したパスに Pre-Maser Secret が出力されている。
また、環境変数に設定するのではなく、シェル変数に設定したほうがセキュリティの面でも安心。

Pre-Maser Secret を使って Wireshark で通信をキャプチャ

先程出力された Pre-Maser Secret を設定する。
編集 -> 設定 から、左メニューの ProtcolTLS を選択。
**(Pre)-Master-Secret log filename** に先程の SSLKEYLOGFILE で指定したファイルを入力し OK を押下。

wireshark_Setting

続いてキャプチャを開始する。
ブラウザでも curl でも、目的のサーバに対して通信を行う。

wireshark_Setting

TSL の復号化が行われ、従来 Protocol が TLSv1.2 だったりした箇所が、 HTTP2 になっていることがわかる。
実際は、 HTTP2 になるかは環境次第だが (今回は ASP.NET で構築したサーバを使っている)。
詳細を見ると、通信内容が復号化されていることがわかる。

下記は Pre-Maser Secret を設定していない 状態のキャプチャ内容。

wireshark_Setting