見えるセキュリティ

TLSフルハンドシェイク

TLS FULL HANDSHAKE

この概念とは?

TLSフルハンドシェイクは、Client(接続する側)とServer(接続先)が、前回の接続の再開情報を使わずに、安全な通信を始める準備をするやり取りです。通信に使う方式を決め、接続先の確認や、通信を守る鍵の準備を行います。

TLS 1.3とTLS 1.2は、TLSのバージョンです。目的は共通ですが、公開情報を送る順番や、通信を保護し始めるタイミングなどに違いがあります。タブを切り替えて、それぞれの流れを見てみましょう。

THEME
crypto
KIND
protocol
REVIEW
self-reviewed ·

公開情報から鍵を準備し、接続先を確かめて、データを守って送る流れ

ここでは、証明書と一時的な鍵共有を使うTLS 1.3のフルハンドシェイクを扱います。セッション再開・0-RTT・Clientの証明書認証は別の教材で扱います。

接続の準備 → データ通信時間は上から下へ ↓
Client接続する側
Server接続先
  1. ClientHello
    方式候補・鍵共有の公開情報
    ClientからServerへ

STEP 1 まで表示しています。続きは「次へ」で追加します。

  • Clientから送る
  • Serverから送る
  • 端点内の処理には通信矢印を付けない

縦の間隔・動く速さは実際の処理時間ではありません。STEPは学習上の区切りで、パケット数や往復数とは別です。

STEP 01 / 6

Clientが接続を提案する

STEP 1 / 6: Clientが接続を提案する

現在のSTEP 1STEP 2STEP 3STEP 4STEP 5STEP 6

Clientは、使える通信方式と、鍵を作るための公開情報をServerへ送ります。公開情報のもとになる秘密の値は、Clientの中に保ちます。

このSTEPで押さえること

公開情報は送る。秘密の値はClientの外へ出さない。

技術的な詳細を見る

この例では、Clientが接続ごとの一時秘密値とECDHEの公開値を用意します。公開値はClientHelloのkey_shareに含めて送ります。ClientHelloにはバージョンや暗号方式などの候補も入ります。秘密の値を送るわけではありません。

パネルの開閉ではSTEPは変わりません。

この概念の要点

  • 防御

    秘密の値は送らず、各自で鍵を作る

    相手へ渡すのは鍵共有の公開情報です。共有秘密や秘密鍵そのものを送り合うわけではありません。

  • 要点

    接続準備の途中から保護する

    ServerHelloの後の証明書・署名・Finishedも、ハンドシェイク用の鍵で保護します。

  • 防御

    接続先の確認とデータ保護は役割が違う

    証明書と署名で接続先を確認し、HTTPなどのデータは方向別の通信鍵で保護します。

  • 要点

    Clientは追加の完了通知を待たない

    Server Finishedを検証し、自分のFinishedを送ると、Clientはデータを送り始められます。

理解確認

今回のTLS 1.3の例で、Clientがデータを送り始められるのはいつでしょう?

参考資料

RELATED CONCEPTS