メインコンテンツまでスキップ

TLS 1.2 vs TLS 1.3 - 仕組みの違い

このドキュメントの目的

TLS 1.2とTLS 1.3の仕組みの違いを理解し、なぜTLS 1.3がより高速・安全かを把握することが目標です。


TLSバージョンの歴史

SSL 1.0(未公開)

SSL 2.0(1995年)← 脆弱性あり、非推奨

SSL 3.0(1996年)← 脆弱性あり、非推奨

TLS 1.0(1999年)← 脆弱性あり、非推奨

TLS 1.1(2006年)← 脆弱性あり、非推奨

TLS 1.2(2008年)← 現在の標準

TLS 1.3(2018年)← 最新、高速・安全

推奨: TLS 1.2以上(TLS 1.0/1.1は使用禁止)


TLS 1.2 ハンドシェイク

フルハンドシェイク(2-RTT)

┌──────────────────┐                    ┌──────────────────┐
│ クライアント │ │ サーバー │
│ │ │ │
│ ──────────────── RTT 1 ──────────────────────────────── │
│ │ │ │
│ ClientHello │ │ │
│ - 暗号スイート │──────────────────→│ 受信 │
│ - TLS version │ │ ↓ │
│ │ │ ServerHello │
│ 受信 │ │ - 暗号選択 │
│ ↓ │←──────────────────│ - 証明書 │
│ 証明書検証 │ ServerHello │ - 鍵交換 │
│ 鍵交換 │ 証明書 │ - ServerDone │
│ │ 鍵交換 │ │
│ │ ServerDone │ │
│ │ │ │
│ ──────────────── RTT 2 ──────────────────────────────── │
│ │ │ │
│ ClientKeyExchange│ │ │
│ ChangeCipherSpec│──────────────────→│ 受信 │
│ Finished │ │ ↓ │
│ │ │ 鍵確定 │
│ 受信 │ │ ChangeCipherSpec│
│ ↓ │←──────────────────│ Finished │
│ 暗号化通信開始 │ │ ↓ │
│ │ │ 暗号化通信開始 │
│ │ │ │
└──────────────────┘ └──────────────────┘

所要時間: 2-RTT(2往復)

  • RTT 1: ClientHello → ServerHello
  • RTT 2: ClientKeyExchange → ChangeCipherSpec

問題点:

  • ハンドシェイクが長い(2往復必要)
  • レイテンシが高い

TLS 1.3 ハンドシェイク

1-RTT ハンドシェイク

┌──────────────────┐                    ┌──────────────────┐
│ クライアント │ │ サーバー │
│ │ │ │
│ ──────────────── RTT 1 ──────────────────────────────── │
│ │ │ │
│ ClientHello │ │ │
│ - 暗号スイート │ │ │
│ - 鍵交換データ │──────────────────→│ 受信 │
│ (推測) │ │ ↓ │
│ │ │ ServerHello │
│ 受信 │ │ - 暗号選択 │
│ ↓ │←──────────────────│ - 証明書 │
│ 証明書検証 │ ServerHello │ - 鍵交換データ │
│ 鍵確定 │ 証明書 │ - Finished │
│ ↓ │ 鍵交換 │ (暗号化済み) │
│ 暗号化通信開始 │ Finished(暗号化) │ ↓ │
│ │ │ 暗号化通信開始 │
│ │ │ │
└──────────────────┘ └──────────────────┘

所要時間: 1-RTT(1往復)

  • RTT 1: ClientHello → ServerHello で完了

改善点:

  • ハンドシェイクが半分(2-RTT → 1-RTT)
  • 高速: レイテンシ50%削減

0-RTT ハンドシェイク(再接続時)

TLS 1.3の追加機能: 以前接続したサーバーに再接続する場合

┌──────────────────┐                    ┌──────────────────┐
│ クライアント │ │ サーバー │
│ │ │ │
│ ClientHello │ │ │
│ + 暗号化された │──────────────────→│ 受信 │
│ HTTPリクエスト │ │ ↓ │
│ (0-RTT data) │ │ 即座にHTTP処理 │
│ │ │ ↓ │
│ 受信 │ │ ServerHello │
│ ↓ │←──────────────────│ + HTTPレスポンス │
│ HTTPレスポンス │ │ │
│ 受信完了 │ │ │
│ │ │ │
└──────────────────┘ └──────────────────┘

所要時間: 0-RTT(ハンドシェイク待ちなし)

制約:

  • 以前接続したサーバーのみ
  • リプレイ攻撃のリスク(冪等なリクエストのみ推奨)

TLS 1.2 vs TLS 1.3 の主な違い

1. ハンドシェイク速度

バージョンハンドシェイク再接続
TLS 1.22-RTT2-RTT
TLS 1.31-RTT0-RTT(オプション)

効果: TLS 1.3は最大50%高速


2. 暗号スイートの簡素化

TLS 1.2:

  • 37種類の暗号スイート
  • 脆弱な暗号も含む(RC4、3DES等)

TLS 1.3:

  • 5種類のみ
  • 安全な暗号のみ(AES-GCM、ChaCha20-Poly1305)

暗号スイート例:

TLS 1.2:
TLS_RSA_WITH_AES_128_CBC_SHA ← 非推奨
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ← OK

TLS 1.3:
TLS_AES_128_GCM_SHA256 ← シンプル
TLS_CHACHA20_POLY1305_SHA256

3. Forward Secrecy(前方秘匿性)

TLS 1.2:

  • Forward Secrecy: オプション
  • RSA鍵交換: Forward Secrecyなし(非推奨)
  • ECDHE鍵交換: Forward Secrecyあり(推奨)

TLS 1.3:

  • Forward Secrecy: 必須
  • RSA鍵交換廃止
  • ECDHE/DHEのみ

Forward Secrecyとは:

サーバーの秘密鍵が漏洩しても、
過去の通信内容は復号できない

仕組み:
- セッションごとに一時的な鍵を生成
- セッション終了後に鍵を破棄

4. 廃止された機能

TLS 1.3で廃止:

  • ❌ RSA鍵交換
  • ❌ 静的DH鍵交換
  • ❌ RC4、3DES、MD5、SHA-1
  • ❌ 圧縮(CRIME攻撃対策)
  • ❌ 再ネゴシエーション

効果: 攻撃面の削減、セキュリティ向上


5. 暗号化範囲の拡大

TLS 1.2:

ハンドシェイク: 平文

ChangeCipherSpec以降: 暗号化

TLS 1.3:

ClientHello/ServerHello: 平文

それ以降: 全て暗号化(証明書も暗号化)

効果: メタデータ漏洩防止(どのサイトにアクセスしたか隠せる)


暗号スイートの構成

TLS 1.2の暗号スイート

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
│ │ │ │ │ │ │
│ │ │ │ │ │ └─ MAC(メッセージ認証)
│ │ │ │ │ └────── ハッシュアルゴリズム
│ │ │ │ └─────────── 暗号化モード
│ │ │ └───────────────── 暗号化アルゴリズム
│ │ └──────────────────────── 鍵交換で使用
│ └───────────────────────────── 認証で使用
└────────────────────────────────── 鍵交換アルゴリズム

複雑: 5-6個のコンポーネント


TLS 1.3の暗号スイート

TLS_AES_128_GCM_SHA256
│ │ │ │
│ │ │ └─ ハッシュアルゴリズム
│ │ └────── 暗号化モード(AEAD)
│ └─────────── 鍵長
└───────────────── 暗号化アルゴリズム

シンプル: 鍵交換と認証が分離(別で定義)


OAuth 2.0/OIDCでの推奨

RFC 6749(OAuth 2.0):

  • TLS 1.2以上を推奨

FAPI 2.0:

  • TLS 1.2以上必須
  • TLS 1.3推奨

実際の運用:

  • TLS 1.2: 広くサポート、安定
  • TLS 1.3: 最新、より高速・安全

推奨: TLS 1.2をサポート、TLS 1.3も有効化


まとめ

学んだこと

  • ✅ TLS 1.3は1-RTT、TLS 1.2は2-RTT
  • ✅ TLS 1.3は0-RTTも可能(再接続時)
  • ✅ TLS 1.3は暗号スイートがシンプル(5種類のみ)
  • ✅ TLS 1.3はForward Secrecy必須
  • ✅ TLS 1.3は暗号化範囲が広い(証明書も暗号化)
  • ✅ TLS 1.0/1.1は非推奨(脆弱性)

TLS 1.3の改善点

項目TLS 1.2TLS 1.3改善
ハンドシェイク2-RTT1-RTT⚡ 50%高速化
再接続2-RTT0-RTT⚡ さらに高速
暗号スイート37種類5種類🔒 シンプル・安全
Forward Secrecyオプション必須🔒 セキュリティ向上
暗号化範囲一部ほぼ全て🔒 メタデータ保護

次に読むべきドキュメント

  1. MTLS(相互TLS認証) - クライアント証明書
  2. OAuth 2.0の基礎 - OAuth 2.0を学ぶ

最終更新: 2025-12-18 対象: 中級者向け(オプション) 学習優先度: 中(TLS基礎があれば十分、バージョン詳細は興味がある人向け)