前方秘匿性(Perfect Forward Secrecy / PFSとも呼ばれる)は、TLS接続の特性であり、たとえサーバーの秘密鍵が将来侵害されても、過去の暗号化通信を復号できないことを保証します。
これは、すべての接続に固有の一時的な鍵を生成することで実現されます。接続終了後、一時鍵は破棄されます。サーバー所有者であっても、誰もそれを再作成できません。
前方秘匿性が重要な理由
前方秘匿性なし(RSA鍵交換)
攻撃者が今日の暗号化トラフィックを記録
↓
数年後、攻撃者がサーバーのRSA秘密鍵を盗む
↓
攻撃者が記録されたすべてのトラフィックを復号 — パスワード、メッセージ、すべて
静的RSA鍵交換(ECDHEなしのTLS 1.2)では、すべてのセッションを復号するために同じサーバー秘密鍵が使用されます。その鍵が盗まれた場合、過去のすべての通信が露出します。
前方秘匿性あり(ECDHE鍵交換)
攻撃者が今日の暗号化トラフィックを記録
↓
数年後、攻撃者がサーバーの秘密鍵を盗む
↓
過去のトラフィックを復号できない — 各セッションはセッション終了後に
破棄された固有の一時鍵を使用していた
各接続で新しいDiffie-Hellman鍵ペアが生成され、固有のセッション鍵が計算され、完了時に一時鍵が破棄されます。サーバーの長期秘密鍵は認証(IDの証明)にのみ使用され、鍵交換(暗号化鍵の導出)には使用されません。
技術的な仕組み
- クライアントとサーバーがそれぞれ一時的なECDHE鍵ペアを生成(ランダム、接続ごと)
- 一時鍵の公開部分を交換
- 両方が同じ共有シークレットを計算 — 自分の一時秘密鍵 + 相手の一時公開鍵を使用(Diffie-Hellmanの数学)
- 共有シークレットからセッション鍵を導出 — AES暗号化に使用
- セッション鍵の導出後、一時鍵を破棄
サーバーの証明書秘密鍵はハンドシェイクメッセージに署名するためだけに使用されます — サーバーが本物であることを証明します。トラフィックの復号には使用されません。
TLSバージョンにおける前方秘匿性
| TLSバージョン | 前方秘匿性 | 備考 |
|---|---|---|
| SSL 3.0 | ❌ 利用不可 | RSA専用鍵交換 |
| TLS 1.0 | ⚠️ オプション | ECDHEをサポートするが必須ではない |
| TLS 1.1 | ⚠️ オプション | TLS 1.0と同じ |
| TLS 1.2 | ⚠️ オプション(ただし推奨) | 暗号スイートに依存 — ECDHE = はい、RSA = いいえ |
| TLS 1.3 | ✅ 必須 | RSA鍵交換は完全に削除 |
TLS 1.3はRSA鍵交換を削除することでこれを解決しました — すべてのTLS 1.3接続はデフォルトで前方秘匿性を持ちます。設定は不要です。
サーバーが前方秘匿性を持っているか確認する
# サーバーが使用する鍵交換を確認
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | grep -E "Server Temp Key|Protocol"
確認ポイント:
Server Temp Key: ECDH, P-256→ ✅ 前方秘匿性(ECDHE)Server Temp Key: X25519→ ✅ 前方秘匿性Server Temp Key行がない → ❌ RSA鍵交換、前方秘匿性なし
TLS 1.2で前方秘匿性を確保する
Nginx:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
ssl_prefer_server_ciphers off;
すべての暗号スイートがECDHEで始まっています — 一時的な鍵交換です。
Apache:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305
SSLHonorCipherOrder off
実世界での関連性
前方秘匿性は以下から保護します:
- 国家レベルの監視 — 政府が暗号化トラフィックを今記録し、鍵を取得したとき(法的命令、ハッキング、量子コンピューティングを通じて)に後で復号することを期待
- サーバーの侵害 — 攻撃者がサーバーの秘密鍵を盗んだ場合、今後はサーバーになりすますことしかできず、過去のトラフィックは復号できない
- 鍵の漏洩 — 秘密鍵の偶発的な露出(例:Gitにコミット、バックアップに含める)
これがLet’s EncryptがECDSA証明書を推奨する理由です — ECDHE鍵交換と自然に組み合わさり、完全に楕円曲線ベースのハンドシェイクを実現します。
よくある質問
SSL証明書が前方秘匿性をサポートする必要がありますか?
証明書自体は前方秘匿性を決定しません。暗号スイートが決定します。どの証明書(RSAまたはECDSA)でもECDHE鍵交換で動作します。ただし、ECDSA証明書はECDHEとより自然に組み合わさり(両方が楕円曲線を使用)、ハンドシェイクがより高速になります。
前方秘匿性はデフォルトで有効ですか?
TLS 1.3:常に有効 — 必須です。TLS 1.2:サーバー設定に依存します。最新のデフォルト(Nginx、Apache)はECDHE暗号スイートを優先しますが、古い設定ではRSA鍵交換がまだ許可されている場合があります。
前方秘匿性は速度を低下させますか?
ほとんど影響ありません。ECDHE鍵交換は最新のハードウェアでハンドシェイクに約1msを追加します。セキュリティの利点はコストを大きく上回ります。
TLS 1.3の0-RTTモードはどうですか?
0-RTT(ゼロラウンドトリップ再開)は特殊なケースです。0-RTTで送信される早期データは、サーバーの侵害に対して前方秘匿性を持ちません(再開に使用されるPSKは前のセッションの鍵から導出されます)。このため、0-RTTは安全でべき等なリクエストにのみ使用すべきです。