SSL/TLSハンドシェイクの仕組みをやさしく図解 — 手順・鍵交換・TLS1.3

カテゴリ: セキュリティ・暗号

アドレスバーの🔒がつくHTTPS通信では、データをやり取りする前に SSL/TLSハンドシェイク という「最初の打ち合わせ」が一瞬で行われています。ここで暗号方式を決め・相手が本物か確認し・本番用の共通鍵を安全に共有します。この記事では、その手順を1ステップずつ図解します。HTTPSの全体像は HTTPとHTTPSの違い、証明書の検証は ディジタル証明書 もどうぞ。手を動かすなら SSL/TLSの可視化 が対応しています。

ハンドシェイクは何のため?

暗号化通信を始めるには、通信相手と次の3つを決めておく必要があります。

この打ち合わせが SSL/TLSハンドシェイク です。SSLは旧称で、いま実際に使われているのは後継の TLS(TLS 1.2 / 1.3)ですが、慣習的に「SSL/TLS」と呼ばれます。

ハンドシェイクの流れ(TLS 1.2)

まずは基本形として、TLS 1.2 の流れを見ます。大きく2往復で共通鍵の共有まで完了します。

クライアント(ブラウザ) サーバー ① ClientHello 対応する暗号スイート・乱数を送る ② ServerHello + 証明書 暗号スイートを決定+サーバー証明書を提示 証明書を検証(本物か確認) ③ 鍵交換(共通鍵のもとを渡す) サーバーの公開鍵で暗号化して送信 両者が同じ共通鍵を導出 ④ Finished(完了) ⑤ 以降は共通鍵で暗号化通信 🔒
TLS 1.2 のハンドシェイク。約2往復で「暗号方式の合意・認証・共通鍵の共有」を終える。

各ステップでやっていること

① ClientHello(クライアント→サーバー)
ブラウザが「私はこれらの暗号方式(暗号スイート)に対応しています」というリストと、乱数を送ります。TLSのバージョンもここで提示します。

② ServerHello + サーバー証明書(サーバー→クライアント)
サーバーがリストの中から使う暗号スイートを1つ選んで返し、あわせてサーバー証明書(公開鍵入り、認証局の署名つき)を提示します。ブラウザは証明書の信頼の連鎖・有効期限・ドメイン一致を検証し、「相手が本物か」を確認します(詳しくは ディジタル証明書)。

③ 鍵交換 — 共通鍵のもとを安全に渡す
ここが核心です。本番データは速い共通鍵暗号で暗号化したいので、その「共通鍵のもと」を相手だけに渡す必要があります。TLS 1.2 では、クライアントが「共通鍵のもと」をサーバーの公開鍵で暗号化して送ります。対応する秘密鍵を持つ本物のサーバーだけが復号できるので、途中で盗み見られても安全です。これで両者が同じ共通鍵を手にします。

④ Finished & ⑤ 暗号化通信の開始
互いに「これで準備完了」(Finished)を送り合い、以降のHTTPのやり取りはすべて共通鍵で暗号化されます。🔒はこの状態を表しています。

🔒 動かして確かめる:このハンドシェイクの流れと「公開鍵で共通鍵を渡す」動きは SSL/TLSの可視化 でステップ表示できます。証明書の検証でなぜ警告が出るかは 証明書チェーン検証の可視化 をどうぞ。

公開鍵と共通鍵の「2段構え」

ハンドシェイクの肝は、2種類の暗号を使い分けることです。

「重いが安全な方法で鍵を渡し、渡したあとは速い方法で本番通信」——この一瞬のバトンタッチがハンドシェイクです。鍵の使い分けの詳細は HTTPとHTTPSの違い でも図解しています。

TLS 1.2 と TLS 1.3 の違い

新しい TLS 1.3 は、ハンドシェイクが大きく改善されています。

TLS 1.2TLS 1.3
往復回数約2往復(2-RTT)約1往復(1-RTT)で高速
鍵交換RSA など旧方式も可毎回使い捨ての鍵のみ(前方秘匿性)
再接続短縮ハンドシェイク0-RTT でさらに速く
安全性弱い方式も残る弱い方式を廃止しシンプルに

前方秘匿性(Forward Secrecy)とは、毎回使い捨ての鍵で鍵交換することで、「将来サーバーの秘密鍵が漏れても、過去の通信は復号されない」性質です。TLS 1.3 ではこれが標準になりました。

毎回フルでやるわけではない — セッション再開

ハンドシェイクは新しい接続のときだけです。一度つないだ相手とは、セッションID/セッションチケットを使った短縮ハンドシェイクで再開でき、鍵交換をやり直さずに済みます。さらに同じサーバーへの複数リクエストは接続を使い回す(Keep-Alive、HTTP/2)ため、1ページに画像が何十個あっても毎回ハンドシェイクは起きません。ポート番号(HTTPSは443)の話は ポート番号とは をどうぞ。

基本情報技術者試験ではこう出る

関連:HTTPとHTTPS / ディジタル証明書 / ネットワークセキュリティの基礎 / 記事一覧。

まとめ

SSL/TLSハンドシェイクは、①暗号方式の合意 → ②証明書で認証 → ③公開鍵で共通鍵を共有 → ④以降は共通鍵で暗号化、という一瞬の打ち合わせです。「重いが安全な公開鍵で鍵を渡し、速い共通鍵で本番」という2段構えが核心。TLS 1.3 ではこれが1往復に短縮され、より速く安全になりました。🔒の裏側を、可視化でも確かめてみてください。

← 記事一覧へ / SSL/TLSの可視化