1 WiresharkでSSL/TSL通信を復号化する
Wiresharkでは、SSL/TSLの暗号化された通信を、復号化して解析することができます。
次に示す2つの方法があります。
① プリマスターシークレット・ログファイルを利用する
(環境変数”SSLKEYLOGFILE”を設定すると、出力されるようになる)
② サーバーの秘密鍵を参照する
この方法は、以下のプロトコルのSSL/TLS通信であっても、適用することができます。
・ HTTPS(443番)
・ SMTPS(465番)
・ POP3S(995番)
・ SIPS(5061番)・・・当然SIPサーバーの秘密鍵は持っていないので、①の方法のみ可
SIPは、あまりなじみがないのかもしれませんが、VoIP規格の1つで、
音声や映像などをネットワーク上でリアルタイムに通信させるプロトコルです。
身近な例として、IP電話の OCN 050plusが5061番のSIPSを使用しています。
図1.1-1に、①の方法によるSMTPS通信の復号化の例を示します。
2 プリマスターシークレット・ログ
環境変数”SSLKEYLOGFILE”に、
プリマスターシークレット・ログの出力パスを設定することにより、
プリマスターシークレット・ログを取得できるようになります。
ここで設定したプリマスターシークレットのログ出力パスをWiresharkに設定すれば、
SSL/TLSの暗号通信が復号化されて見られるようになります。
プリマスターシークレットとは、後からマスターシークレットを生成するための元データです。
マスターシークレットは、
暗号化通信を行うにあたって利用される以下の要素を生成するための元データとなります。
・ 暗号化通信に利用する鍵(通信対象のアプリケーション データの暗号化に使用する鍵)
・ メッセージ認証コード(MAC)に使用する鍵
・ CBCモードなどで利用される初期化ベクトル
ちなみに、プリマスターシークレット・ログは、
図2.0.-1に示すようなテキスト形式のファイルです。
2.1 Windowsでの環境変数”SSLKEYLOGFILE”の設定
特定のコマンドのみ、特定のユーザーのみ、またはPC全ユーザー、
と環境変数の有効なスコープにより設定方法はいくつかありますが、
ここではPC全ユーザーで有効となる環境変数”SSLKEYLOGFILE”の設定方法を示します。
まず、
「スタートメニュー」⇒「設定」⇒「システム」⇒「詳細情報」⇒「システムの詳細設定」の順で
「システムのプロパティ」を開きます。
図2.1-1に示すように、
「システムのプロパティ」の「詳細設定」で、「環境変数(N)…」をクリックします。
図2.1-2において、
「システム環境変数(U)」の「編集(I)…」をクリック。
開いたダイアログに、次のよう設定します。
2.2 Wiresharkにプリマスターシークレット・ログのファイルパスを設定する
プリマスターシークレット・ログのファイルパスを、
以下に示す手順で、Wiresharkに設定します。
ⅰ)Wiresharkを立ち上げ、メニュー「編集(E)」⇒「設定…(P)」をクリックする。
ⅱ)左メニュー「Protocols」リストから「TLS」を選択します。
開いた右ペイン「Transport Layer Security」の「(Pre)-Master-Secret log filename」に、
2.1節で設定したプリマスターシークレット・ログのファイルパスを設定します。
# 「(Pre)」と括弧付きになっているので、
# 条件付きで「マスターシークレット」でも良いってことなのかな?
以上で、設定は終わりです。
3 サーバーの秘密鍵を参照する
これは、特定のサーバーの秘密鍵を直接利用して、暗号を復号化する方法です。
自宅サーバーなどでSSL設定を直接行っているような環境でないと、
秘密鍵を参照することはできませんので、この方法は適用できません。
また、秘密鍵を参照できるようにしたSSL/TSL通信しか暗号を復号化できません。
暗号化通信を復号化するには、2章で示した方法で充分なのですが、
何かの都合で2章の方法が使えない時などのために、
別の方法を知っておいても損になることは無いと思います。
3.1 秘密鍵ファイルの条件
TLSの鍵ファイル(公開鍵/秘密鍵)のファイル形式は複数存在するため、
場合によってはWiresharkでの解読に適した形、
すなわちPEM形式(秘密鍵付きの公開鍵証明書)に変換する必要があります。
また、PEMファイルには、パスフレーズ付きのものとパスフレーズ無しのものがありますが、
パスフレーズ付きのPEMファイルはうまく読み込めないことがあります。
この場合も、”openssl”コマンドなどでファイル形式を変換します。
証明書ファイルの変換については、本記事では省略します。
3.2 CentOS 7, 8、およびRHEL 8におけるLet's Encryptの秘密鍵
例として、Let's Encryptの秘密鍵保存位置を示します。
CentOS 7, 8、およびRHEL 8の場合では、次のようになっています。
なお、参考として、他の証明書の位置も表3.2-1に示します。
PEM形式とはいっても、テキストで書かれていますので、
viなどのテキストエディターで中身をみることができます。
表3.2-1 Let's Encryptのサーバー証明書
3.3 Wiresharkに秘密鍵のファイルパスを設定する
秘密鍵のファイルパスは、2.2節で示したのと同じダイアログ
(「編集(E)」⇒「設定…(P)」⇒「Protocols」⇒「TLS」)で設定します。
「Transport Layer Security」ペインの「RSA keys list」の「編集…」をクリック。
図3.3-1に示すダイアログが開きますので、「+」をクリックして、
秘密鍵のファイルパスとともに、
監視するIPアドレス、ポート番号、プロトコルなどを入力します。
以上で、設定は終わりです。
以上
HTMLだと、
思うように編集することは難しく、やろうすればとっても時間が掛かります。
ですので、本記事の元となっているWordで作成したPDFを
ページ最後に貼り付けました。
役に立てていただければ、うれしく思います。
このPDFファイルは、自由に配布されてもかまいません。
ただし、再配布の際には、
入手元と著者名は明らかにしてください。
なお、上のPDFファイルの内容、また本文中の記述に、
誤字や脱字、誤った内容の記述など見つかりましたら、
下に示すフォームでご連絡いただければ幸いです。