🔑 TLS1.3ハンドシェイクの流れを理解する
🌱 はじめに
TLS1.3は従来のTLSよりも「速く、安全」に通信を始められるように設計されています。その肝となるのがハンドシェイクの簡略化です。ここではTLS1.3のハンドシェイクを、図解を交えながら順を追って説明します。
📡 TLS1.2までとの違い
-
TLS1.2まで
-
2往復(2-RTT)必要
-
RSA鍵交換や署名方式など、古い仕組みが多く複雑
-
-
TLS1.3
-
1往復(1-RTT)で暗号化開始
-
Forward Secrecy必須(ECDHEベース)
-
不要な暗号やメッセージを削除
-
TLS1.3の大きな進化は「セキュリティ強化」と「ラウンドトリップ削減」の両立にある。
🛠️ ハンドシェイクの流れ(1-RTTの場合)
① ClientHello
-
クライアント(ブラウザなど)が送信。
-
含まれるもの:
-
サポートする暗号スイート(AES-GCM, ChaCha20など)
-
サポートする鍵交換方式(ECDHEなど)
-
乱数(ランダム値)
-
0-RTT再利用用のトークン(あれば)
-
② ServerHello
-
サーバーが受信し、利用する暗号スイートを決定。
-
サーバー乱数を生成。
-
ECDHEの公開鍵を送信。
-
TLS1.3以降は、ここからすでに暗号化が始まる。
③ サーバー証明書 & CertificateVerify
-
サーバーが自分の正当性を証明するために証明書を送信。
-
証明書の秘密鍵で署名し、改ざんがないことを確認できる。
④ Finished(サーバー→クライアント)
-
サーバーが「ここまでの通信内容に改ざんがない」ことをMACで示す。
⑤ Finished(クライアント→サーバー)
-
クライアントも同様にFinishedを送り、これで相互に認証が完了。
-
以降の通信はアプリケーションデータとして暗号化される。
🔄 0-RTTの流れ(再接続時)
-
すでに過去に接続してセッション情報が保存されている場合、クライアントはClientHelloの直後にデータを送れる。
-
初回の応答を待たずに送れるため遅延がほぼゼロに。
-
ただし「リプレイ攻撃」に弱いため、サーバー側で再送を防ぐ工夫が必要。
📝 ハンドシェイクの全体像(図解)
Client Server
| ClientHello --------> |
| |
| <-------- ServerHello |
| <---- EncryptedExtensions |
| <--- Certificate |
| <--- CertificateVerify |
| <--- Finished |
| |
| Finished -------> |
| |
| [暗号化通信開始] |
TLS1.2では2往復かかったやりとりが、TLS1.3では1往復で完了する。
🎯 まとめ
TLS1.3のハンドシェイクは、
-
ClientHello → ServerHello → 相互Finished のシンプルな流れ
-
Forward Secrecyの徹底
-
0-RTTによる再接続高速化
によって、より安全で高速な通信開始を可能にしています。