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 Protocol5. 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

復号後のTLS通信の状況

復号したTLS

フレーム番号(以降は#と表記)9以降から表示が違っています。復号されない状態ですと、暗号化されている部分のデータは、[Application Data]と表示されます。

復号したTLSのメッセージデータ

ここでひとつ疑問が生じます。ListペインでTLS1.3と翻訳されているにも関わらず、なぜかDetailペインでVersionが"TLS 1.2 (0x0303)"となっていることです。

TLSのバージョン

従来、このフィールドは、SSL3.0=0x0300、 TLS1.0=0x0301、 TLS1.1=0x0302、 TLS1.2=0x0303となっていたはずです。
気になって調べたところ、RFC8446 -Appendix D. Backward Compatibilityに理由が記載されていました。
TLS1.3ではこのフィールドは使用されていませんが、TLS1.3をサポートしないサーバとの下位互換用のためにTLS1.3をサポートしている場合はこのフィールドに"0x0303"を格納します。

そしてTLS1.3のバージョンのネゴシエーションは、Client Hello(#4)とServer Hello(#6)の間のSupported_versionsパラメータによって行います。

Client HelloのSupported_versions

Client HelloのSupported_versions

Server 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