SSL/TLSの復号#2 ~実際の通信はどうなっている?~
TLSの復号#1で、SSL/TLSを復号するためのWiresharkの設定について解説しました。
今回は、その設定を使用して実際に復号化されたパケットを見てみます。
余談ですが、やっとWireshark Ver.4.0がリリースされましたね。しかしながら、前回の記事はVer.3.6.8の内容で書きましたので、引き続き同じパージョンで解説していきます。
TLSパケットの構成
実際にパケットを見る前にTLSパケットの構造についての概要です。
TLSは「TLSハンドシェイクプロトコル」と「TLSレコードプロトコル」の2つのプロトコルが存在します。
プロトコル | 役割 |
---|---|
TLSハンドシェイクプロトコル | 暗号化通信を行うにあたっての必要なパラメータをネゴシエートするプロトコル |
TLSレコードプロトコル | メッセージの圧縮、暗号化、データの認証を行うプロトコル |
TLSの仕様は、RFC8446 - The Transport Layer Security (TLS) Protocol Version 1.3 にてリリースされています。タイトルは、TLS1.3となっていますが、TLS1.2での実装の要件も同時に指定されています。
(RFC5246 - The Transport Layer Security (TLS) Protocol Version 1.2 は廃止されていますのでご注意ください。)
各プロトコルの詳細は、RFC8446のコンテンツ、4. Handshake Protocol、5. Record Protocolの章をご参照ください。
今回の実験環境
今回は、SYNESISとWindows PCの間でどのような通信がされているかを実験します。
SYNESISとは、当社が開発、販売しているパケットキャプチャ装置です。導入しやすいWebベースでのGUIとなっており、国内、海外で好評いただいています。
今回はこのSYNESISをWebサーバとして使用します。
構成は、以下の通りです。
Client PCからはSYNESISへは推奨ブラウザであるForefoxで接続します。TLSの復号#1のセッションごとのPre-Maser Secretを登録する方法の通り、Client PCでSSLKEYLOGFILEの環境変数を設定してからSYNESISへ通信します。
その様子をClientPCのWiresharkでキャプチャして復号します。
SYNESISとの通信パケットを復号
では早速キャプチャした結果を見てみましょう。まずは、Pre-Maser Secretを登録せず見てみます。
わかりやすいようにIPアドレス表示ではなく、"Server"と"Client"で表示しています。
復号前のTLS通信の状況
復号後のTLS通信の状況
フレーム番号(以降は#と表記)9以降から表示が違っています。復号されない状態ですと、暗号化されている部分のデータは、[Application Data]と表示されます。
ここでひとつ疑問が生じます。ListペインでTLS1.3と翻訳されているにも関わらず、なぜかDetailペインでVersionが"TLS 1.2 (0x0303)"となっていることです。
従来、このフィールドは、SSL3.0=0x0300、 TLS1.0=0x0301、 TLS1.1=0x0302、 TLS1.2=0x0303となっていたはずです。
気になって調べたところ、RFC8446 -Appendix D. Backward Compatibilityに理由が記載されていました。
TLS1.3ではこのフィールドは使用されていませんが、TLS1.3をサポートしないサーバとの下位互換用のためにTLS1.3をサポートしている場合はこのフィールドに"0x0303"を格納する仕様だということが判明しました。ですので、このようにVersionの値と実際のバージョンが異なることは正常な動作のようです。
TLS1.3のバージョンの実際のネゴシエーションは、Client Hello(#4)とServer Hello(#6)の間のSupported_versionsパラメータによって行います。
Client HelloのSupported_versions
Server HelloのSupported_versions
Client でクライアントがサポートしているバージョンをサーバへ提示し、サーバはサポートしている中で一番最適なバージョンをクライアントへ送信することで、ネゴシエーションが成立します。
あとがき
今回はTLSの復号#1で行ったWiresharkの設定をもとに実際のパケットを見てみました。やはり実際のパケットを見ると、RFCへの理解も深まります。
SYNESISは、セキュリティ上の理由からTLS1.2とTLS1.3のみをサポートしています。これは一般的に最も推奨されている対策です。
今回いろいろ調査したところ、TLS1.2とTLS1.3では仕様が大きく異なっていました。次回の記事では、同じSYNESISを使って、TLS1.2とTLS1.3の通信の比較を行ってみた結果を解説します。
なお、今回の記事を書くにあたり、RFCと同じくらい以下のサイトを参考にさせていただきました。英語で書かれているところが難点ですが、コンテンツがまとまっていて非常にわかりやすかったです。
The Illustrated TLS 1.3 Connection
The Illustrated TLS 1.2 Connection