1.

TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説

編集
この記事の要点
  • TLS(旧称 SSL)は通信経路を暗号化し、盗聴・改ざん・なりすましを防ぐプロトコルである
  • ハンドシェイクで「公開鍵暗号による鍵交換」と「対称鍵による本文暗号化」を組み合わせる
  • TLS 1.3 はハンドシェイクを 1-RTT に短縮し、危険な暗号スイートを廃止して安全性と速度を両立した
  • 前方秘匿性(PFS)により、サーバー秘密鍵が漏れても過去の通信は復号されない
  • SNI で 1 つの IP に複数証明書を載せられ、証明書検証で接続先の正当性を確認する

概要

TLS(Transport Layer Security)は、TCP の上に被せて通信を暗号化する標準プロトコルです。かつて Netscape が SSL(Secure Sockets Layer)として開発しましたが、SSL 2.0/3.0 には深刻な脆弱性が見つかり、現在はすべて廃止されています。後継として IETF が標準化したものが TLS であり、TLS 1.0/1.1 も非推奨となった今、実務で使うのは TLS 1.2TLS 1.3 の 2 つです。習慣的に「SSL 証明書」「SSL 化」と呼ばれますが、中身は TLS だと理解しておくと混乱しません。HTTPS は、この TLS の上に HTTP を載せたものに過ぎません。

TLS が守るのは 3 つの性質です。機密性(盗聴されても中身が読めない)、完全性(途中で改ざんされたら気づく)、認証(接続先が名乗り通りの相手である)。この 3 つを、公開鍵暗号と対称鍵暗号、そして証明書という 3 つの道具で実現します。

仕組み

TLS の核心は「最初に高コストな公開鍵暗号で安全に鍵を共有し、以降は高速な対称鍵暗号で本文を流す」というハイブリッド方式です。

対称鍵暗号(AES など)は暗号化と復号に同じ鍵を使い、非常に高速です。しかし鍵を相手にどう渡すかが問題になります。そこで 公開鍵暗号(RSA や楕円曲線)を使い、誰でも暗号化できるが秘密鍵を持つ者だけが復号できる仕組みで、対称鍵の素材を安全に交換します。TLS 1.3 では鍵交換に必ず (EC)DHE(楕円曲線ディフィー・ヘルマン)を用い、これにより前方秘匿性(PFS / Forward Secrecy)が保証されます。PFS とは、仮にサーバーの秘密鍵が将来盗まれても、過去に記録された通信を遡って復号できない性質のことです。

ハンドシェイクの流れ(TLS 1.3 の場合)は次の通りです。(1) クライアントが ClientHello で対応する暗号スイートと鍵交換用の公開値、接続先ホスト名(SNI)を送る。(2) サーバーが ServerHello で暗号スイートを 1 つ選び、自分の公開値と証明書を返す。(3) クライアントが証明書の検証(署名・有効期限・ホスト名・CAの信頼チェーン)を行う。(4) 双方が共有秘密から同じ対称鍵を導出し、以降は暗号化された通信に切り替わる。TLS 1.2 では往復が 2 回(2-RTT)必要でしたが、TLS 1.3 では 1-RTT に短縮され、再接続時は 0-RTT も可能になりました。

SNI(Server Name Indication)は、ClientHello に接続先ホスト名を含める拡張です。1 つの IP アドレスで複数のドメイン(複数証明書)をホストする際、サーバーがどの証明書を返すべきか判断するために使われます。共有ホスティングや CDN では必須の仕組みです。

設定・実用例

OpenSSL コマンドでサーバーの TLS 設定を確認できます。バージョンや証明書チェーンを点検する際の定番です。

# 接続して証明書チェーンとプロトコルを確認
openssl s_client -connect example.com:443 -servername example.com

# TLS 1.3 のみを強制して疎通確認
openssl s_client -connect example.com:443 -tls1_3

# サーバーが対応する暗号スイート一覧(nmap)
nmap --script ssl-enum-ciphers -p 443 example.com

Nginx で TLS 1.2/1.3 のみを許可し、前方秘匿性のある暗号スイートに限定する設定例です。

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=63072000" always;

HSTS ヘッダーを付けることで、ブラウザに「次回以降は最初から HTTPS で接続せよ」と指示でき、常時SSL化を確実にします。

主な用途

  • HTTPS(Web):もっとも一般的な用途。ログイン情報やフォーム入力を保護する
  • メール:SMTP/IMAP/POP3 を STARTTLS や暗黙 TLS で保護する
  • VPN・API 通信:マイクロサービス間や外部 API 呼び出しの暗号化
  • DB 接続:MySQL/PostgreSQL のクライアント-サーバー間暗号化

比較テーブル

項目TLS 1.2TLS 1.3
ハンドシェイク2-RTT1-RTT(再接続 0-RTT)
鍵交換RSA / DHE / ECDHE(EC)DHE のみ(PFS 必須)
前方秘匿性選択可(RSA 鍵交換だと無し)常に有効
暗号スイート多数(弱いものも残存)5 種に厳選(AEAD のみ)
旧式暗号RC4・3DES など設定次第で使用可すべて廃止

注意点

  • SSL 2.0/3.0、TLS 1.0/1.1 は無効化する。POODLE・BEAST など既知の攻撃が成立する
  • 証明書の有効期限切れは即サービス停止につながる。自動更新(Let's Encrypt等)を入れる
  • 暗号スイートは AEAD(GCM・ChaCha20-Poly1305)を優先し、CBC や RC4 を避ける
  • TLS は経路を守るだけで、サーバー側に届いた後の保管・処理は別途守る必要がある

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. TLS/SSLの仕組み
  2. 証明書と認証局(CA)
  3. ファイアウォール
  4. iptables/nftables
  5. VPN
  6. IPsec
  7. WireGuard
  8. ゼロトラストネットワーク

最近更新/作成されたページ