コンテンツにスキップ

TLS セキュリティの仕組みと面接頻出ポイント

問題

How does TLS ensure secure communication between client and server?

解答

TLS は「鍵交換 → 認証 → 暗号化通信」の3ステップで安全な通信を確立する。

解説

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

Client                          Server
  |                               |
  |-- ClientHello ─────────────> |  (対応暗号スイート, ランダム値)
  |                               |
  |<── ServerHello ─────────── |  (選択した暗号スイート)
  |<── Certificate ──────────── |  (サーバー証明書)
  |<── CertificateVerify ──── |  (証明書の署名)
  |<── Finished ───────────── |
  |                               |
  |── Finished ────────────── >|
  |                               |
  |<══ 暗号化された通信開始 ══>|

鍵交換の仕組み

# ECDHE (Elliptic Curve Diffie-Hellman Ephemeral)

1. クライアント・サーバーそれぞれが一時的な鍵ペアを生成
   Client:  a(秘密鍵), A = g^a mod p(公開鍵)
   Server:  b(秘密鍵), B = g^b mod p(公開鍵)

2. 公開鍵を交換する(平文でOK)

3. 共有秘密鍵を算出
   Client:  B^a mod p = g^(ab) mod p
   Server:  A^b mod p = g^(ab) mod p
   → 同じ値になる(Pre-Master Secret)

4. Pre-Master Secret からセッション鍵を導出
   Master Secret → Application Data Keys

サーバー認証の仕組み

証明書チェーン検証:
  ブラウザ (Root CA 信頼) 
    └── Root CA が署名した Intermediate CA
          └── Intermediate CA が署名した Server Certificate
                └── サーバーが保持する秘密鍵

検証手順:
  1. 証明書の有効期限を確認
  2. ドメイン名が証明書の CN/SANs と一致するか確認
  3. 証明書チェーンを Root CA まで辿って署名を検証
  4. CRL/OCSP で失効していないか確認

TLS 1.2 vs TLS 1.3 の比較

項目 TLS 1.2 TLS 1.3
ハンドシェイク往復 2-RTT 1-RTT
0-RTT 再開 不可 可能(PSK使用)
鍵交換 RSA も使用可能(前方秘匿性なし) ECDHE のみ(前方秘匿性あり)
古い暗号スイート RC4, 3DES 等が使用可能 廃止(AES-GCM, ChaCha20 のみ)
証明書暗号化 平文 暗号化(中間者が見れない)

前方秘匿性(Forward Secrecy)とは

# 前方秘匿性なし(RSA 鍵交換)の危険性:
過去の通信を録音 → 将来秘密鍵が漏れる → すべての過去通信が復号可能

# 前方秘匿性あり(ECDHE):
各セッションで一時鍵を使用 → セッションキーは捨てられる → 秘密鍵が漏れても
過去の通信は復号不可

面接でのポイント

  • TLS と SSL の違いを言えること(SSL は廃止、TLS 1.2/1.3 が現役)
  • ハンドシェイクの流れを大まかに説明できること(鍵交換 → 認証 → セッション鍵生成)
  • HTTPS が TLS + HTTP であることを知っていること
  • 前方秘匿性(Forward Secrecy)の概念を説明できると加点
  • TLS 1.3 の改善点(1-RTT、古い暗号廃止)を説明できると高評価
  • 証明書チェーンの検証プロセスを説明できるとさらに加点