SSL/TLSの復号#1 ~Wiresharkの設定~

最近のWebは、サイト全体が暗号化されています。これは、すなわちなりすましや盗聴、改ざんのリスクが低減することを意味していますので、ユーザにとっては安心です。
しかしながら、管理者にとっては、どのようなやりとりが発生していたか暗号化されているためわからず悩ましい問題となっています。マルウェアを通信の中に紛れ込ませてドライブ・バイ・ダウンロードを仕掛ける、みたいな暗号化を逆手に取った攻撃も最近では増えてきていると聞きます。
みなさまおなじみのWebの通信は、サーバとクライアントの間をTLS(Transport Layer Security)というプロトコルで暗号化しています。

今回は、キャプチャしたTLSプロトコルのWiresharkでの復号設定について解説します。Wiresharkは、Ver.3.6.8(現時点での安定化最新バージョン)を使用しています。

SSL/TLSは歴史が古くいろいろと奥が深いプロトコルですので、3回にわけて解説します。

SSL/TLSバージョンの変遷

TLSとは、ネットワーク上でやり取りされるデータを暗号化するためのプロトコル名のことです。当初は、SSL(Secure Socket Layer)というプロトコル名で呼ばれていました。

SSLは、もともとNetscape社が開発したプロトコルでした。SSL1.0はリリース前に重大欠陥が見つかり公開されることはなくSSL2.0となり、さらに脆弱性が発見されたため、設計を見直しSSL3.0がリリースされました。
その後、SSLはセキュリティ専門家を交えた第三者機関で開発するためIETFへ移管され、TLSをリリースしました。TLS1.0、TLS1.1、TLS1.2とバージョンアップされ、2018年にはTLS1.3がRFC8446にてリリースされています。

実際にSSL3.0とTLS1.0の違いはわずかですが、互換性は全くありません。「SSL/TLS」などのように併記されている理由は、TLSが登場した段階で既にSSLという名称が広く使われていたためです。

バージョン別SSL/TLSのシェア

世界のSSL/TLSの動向は、Qualys SSL Labsで閲覧できます。
以下のグラフは、SSL Labsで調査した150,000のWebサイトのリストに基づいたSSL/TLSのバージョン別対応のサポート状況となっています。
出典:Qualys SSL Pulse September 04, 2022 Scan

サポートされているプロトコルバージョン

Qualys SSL Pulse September 04, 2022 Scan

TLS1.2は99.8%とほとんどのサイトでサポート済
TLS1.3は56.9%と半数を超えた結果
一方非推奨であるTLS1.0とTLS1.1も40%弱は未だ無効化されていない状況

最上位のプロトコルバージョン

Qualys SSL Pulse September 04, 2022 Scan

TLS1.2は42.9%、TLS1.3は56.3%とTLS1.3での通信がTLS1.2を上回った結果
またTLS1.1までのバージョンまでしかサポートされていない状況はまれ

思ったよりTLS1.3は普及されているようですね。
Qualys SSL Pulseでは、SSL/TLSのサポート状況ほか、HTTP/2やSPDYの対応状況などが確認できます。

WiresharkでTLSを復号する方法

WiresharkでTLSを復号する方法は2種類あります。

  1. サーバの秘密鍵を登録する方法
  2. セッションごとのPre-Maser Secretを登録する方法

1.はキャプチャしたあとでも秘密鍵の登録が可能です。
やっかいなのは、2.の方法で行う場合です。この場合は、TLS通信しているクライアント(正確に言うとクライアントのブラウザ)のセッションごとの鍵のもと(Pre-Maser Secret)を書き出し、それをWiresharkに読み込ませて復号します。Pre-Maser Secretはセッションごとにかわりますので、Pre-Maser Secretの設定を行わずにキャプチャした場合、あとから復号できません。
しかしながら1.の方法は、鍵交換方式をRSAで行っている場合のみ可能です。
TLS1.3では、Perfect Forward Secrecy (PFS)暗号のみが使用されるため、RSAはそもそも非サポートです。また、インターネット上にあるほとんどのサイトがRSA鍵交換方式ではなくDH系(DHEやECDH含む)で実施されているため、1.の方法では実現できません。

詳細は、Wireshark Wiki TLSを参照ください。

WiresharkでTLSを復号する手順

TCPの設定

まずは、TCPの設定を行います。どちらの方法で復号するにせよ、以下の手順を実施しないとうまく復号できませんので、ご注意ください。

  1. Wiresharkを起動し、[Edit]menu > Preferences > Protocols > TCPを選択します。
  2. "Allow subdissector to reassemble TCP stream"と"Reassemble out-of-order semgemnts"の項目をチェックします。

TCP設定_Wireshark

"Reassemble out-of-order semgements"は、Wireshark V3.0以降はデフォルトでは無効となっています。こちらを行わないとTCP上の順序不正のデータに対しての復号が行われなくなります。

サーバの秘密鍵を登録する方法で復号

  1. Wiresharkを起動し、[Edit]menu > Preferences > Protocols > TLSを選択します。
  2. "RSA keys list"から[Edit]ボタンをクリックし、+ボタンで以下の項目を設定します。

SSL/TLS_RSA鍵_Wireshark

項目 説明
IP address サーバのIPアドレスを入力
Port サーバのポート番号を入力、HTTPSの場合は通常"443"
Protocol プロトコル名をWiresharkのダイセクタ名で入力、HTTPSの場合は"http"
Key File 秘密鍵のファイルパスを入力
Password (秘密鍵にパスフレーズを設定している場合のみ)パスフレーズを入力

この方法は先にもお伝えした通り、限られた状況でしか復号できません。

  • 鍵交換のアルゴリズムはDH系(DHEやECDH含む)ではないこと
  • SSL3.0、(D)TLS1.0-1.2のみサポート
  • 秘密鍵はサーバー証明書と一致、クライアント証明書や認証局 (CA) 証明書では非サポート
  • キャプチャファイルにClientKeyExchangeメッセージを含むことが必要

なお、Wireshark Wikiでは、TLS画面からのRSA鍵の登録は非推奨となっており、今後は、Perences > Protocols > RSA Keysでの登録が推奨されているようです。
Wireshark Ver.3.6.8では、TLS画面からの登録で問題なく復号できました。今後設定できなくなるかもしれませんので、ご注意ください。

セッションごとのPre-Maser Secretを登録する方法で復号

ブラウザによるHTTPS通信の場合、環境変数 SSLKEYLOGFILEを設定し、TLSセッションキーを指定フォルダのファイルへ書き込みをし、そのファイルをWiresharkで読み込めば復号されます。現在この操作がサポートされていることが確認できているブラウザは、Chrom、FireFox、ChromiumベースのMicrosoft Edgeです。

  1. 環境変数の設定を行います。Windowsの検索機能で「詳細設定」と入力し、「システムの詳細設定の表示」を選択します。その[環境変数]ボタンをクリックします。
  2. システム環境変数を追加します。[新規(W)…]ボタンをクリックし、変数名のボックスに"SSLKEYLOGFILE"と入力し、変数値にファイルの出力先を設定します。(ここでは、C:\work\tlskey.txtとしています。)

    SSL/TLS_Pre Master Secret

  3. [OK]ボタンを押し、OSを再起動します。
  4. ブラウザを起動し、該当ファイルが出来ていることを確認します。
  5. Wiresharkでキャプチャを開始し、復号したいWebサーバとの接続を行います。
  6. 通信が終了したらブラウザを閉じ、キャプチャを停止します。
  7. [Edit]menu > Preferences > Protocols > TLSを選択、"(Pre)-Master-Secret"に2.で設定した出力先を入力します。

    SSL/TLS_Pre Master Secret_Wireshark

あとがき

今回は、SSL/TLSのこれまでと現在の状況、そしてTLSをWiresharkで復号する設定方法について解説しました。
次回は、セッションごとのPre-Maser Secretを登録する方法で実際にSYNESIS(Webサーバ)を用いて、クライアントとの間でどのような通信がされているかをキャプチャして確認した結果を解説します。

Englishi Contents of Engineer Notes