SSL/TLSの仕組みを完全解説
暗号化通信とデジタル証明書の基礎
SSL/TLSはHTTPS通信の基盤となる暗号化プロトコルです。
ハンドシェイクの流れ、証明書チェーン、暗号スイートの仕組みなど、ネットワークスペシャリスト試験で問われるポイントを解説します。
こんな人向けの記事です
- SSL/TLSの仕組みを体系的に理解したい
- TLSハンドシェイクの流れを把握したい
- デジタル証明書とPKIの仕組みを知りたい
Step 1SSL/TLSの概要
SSL(Secure Sockets Layer)とTLS(Transport Layer Security)は、通信を暗号化してデータの盗聴・改ざんを防ぐプロトコルです。現在はSSLは非推奨となり、TLS 1.2/1.3が使われています。
| バージョン | 状態 | 備考 |
|---|---|---|
| SSL 2.0 | 廃止 | 重大な脆弱性あり |
| SSL 3.0 | 廃止 | POODLE攻撃に脆弱 |
| TLS 1.0 | 非推奨 | BEAST攻撃のリスク |
| TLS 1.1 | 非推奨 | 2021年に主要ブラウザが無効化 |
| TLS 1.2 | 現行 | 広く利用されている標準 |
| TLS 1.3 | 最新 | 2018年策定。高速・高セキュリティ |
SSL/TLSが提供する3つの機能
機密性:共通鍵暗号による通信データの暗号化完全性:MAC(メッセージ認証コード)による改ざん検知
認証:デジタル証明書によるサーバー(/クライアント)の認証
Step 2暗号技術の基礎
| 種類 | 方式 | 特徴 | 代表的なアルゴリズム |
|---|---|---|---|
| 共通鍵暗号 | 同じ鍵で暗号化・復号 | 高速だが、鍵の受け渡しが課題 | AES, ChaCha20 |
| 公開鍵暗号 | 公開鍵で暗号化、秘密鍵で復号 | 鍵配送が容易だが低速 | RSA, ECDSA |
| 鍵交換 | 安全に共通鍵を共有 | 盗聴されても鍵を推測できない | DH, ECDHE |
| ハッシュ | 固定長のダイジェストを生成 | 一方向性、改ざん検知に利用 | SHA-256, SHA-384 |
TLSで暗号を組み合わせる理由
TLSでは公開鍵暗号で安全に鍵を交換し、実際のデータ通信は共通鍵暗号で高速に行います。さらにハッシュで改ざんを検知します。これをハイブリッド暗号方式と呼びます。
Step 3TLSハンドシェイク
TLS 1.2 ハンドシェイク(2-RTT)
Client Hello
(対応バージョン、暗号スイート、乱数)
(対応バージョン、暗号スイート、乱数)
↓ ↑
Server Hello + 証明書 + 鍵交換
(選択した暗号スイート、サーバー証明書、DH公開値)
(選択した暗号スイート、サーバー証明書、DH公開値)
↓ ↑
Client 鍵交換 + ChangeCipherSpec + Finished
(プリマスターシークレット送信)
(プリマスターシークレット送信)
↓ ↑
Server ChangeCipherSpec + Finished
(暗号化通信開始)
(暗号化通信開始)
暗号スイートの読み方
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS → プロトコル
ECDHE → 鍵交換アルゴリズム(楕円曲線DH、前方秘匿性あり)
RSA → サーバー認証アルゴリズム
AES_256_GCM → データ暗号化(AES 256bit、GCMモード)
SHA384 → ハッシュ(MAC)アルゴリズム
前方秘匿性(PFS: Perfect Forward Secrecy)
ECDHE等の一時的な鍵を使う方式では、サーバーの秘密鍵が漏洩しても過去の通信は復号できません。これを前方秘匿性(PFS)と呼びます。試験でもよく問われる重要概念です。
Step 4デジタル証明書とPKI
デジタル証明書は、公開鍵の所有者を証明するための電子文書です。CA(認証局)が発行し、PKI(公開鍵基盤)で信頼の連鎖を構築します。
証明書に含まれる情報(X.509形式)
| フィールド | 内容 |
|---|---|
| Subject | 証明書の所有者(ドメイン名、組織名等) |
| Issuer | 発行元CA |
| 有効期間 | Not Before 〜 Not After |
| 公開鍵 | 所有者のRSA/ECDSA公開鍵 |
| 署名 | CAの秘密鍵による電子署名 |
| SAN | Subject Alternative Name(複数ドメイン対応) |
証明書チェーン(信頼の連鎖)
ルートCA証明書
(ブラウザ/OSにプリインストール)
(ブラウザ/OSにプリインストール)
↓ 署名
中間CA証明書
(ルートCAが署名)
(ルートCAが署名)
↓ 署名
サーバー証明書
(中間CAが署名)
(中間CAが署名)
証明書の種類(検証レベル)
| 種類 | 検証内容 | 費用 | 用途 |
|---|---|---|---|
| DV(ドメイン認証) | ドメイン所有権のみ | 無料〜安価 | 個人サイト、ブログ |
| OV(企業認証) | 組織の実在性を確認 | 中程度 | 企業サイト |
| EV(拡張認証) | 厳格な組織審査 | 高額 | 金融機関、ECサイト |
Step 5TLS 1.3の改善点
| 項目 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| ハンドシェイク | 2-RTT | 1-RTT(0-RTTも可能) |
| 鍵交換 | RSA鍵交換も可能 | ECDHE/DHEのみ(PFS必須) |
| 暗号スイート | 多数(脆弱なものも含む) | 安全なもののみ5種類に厳選 |
| 暗号化開始 | Finished後 | Server Hello直後 |
| 廃止された機能 | — | RC4, 3DES, SHA-1, 圧縮, 再ネゴシエーション |
0-RTT(Early Data)
TLS 1.3では過去に接続したことがあるサーバーに対し、ハンドシェイク完了前にデータを送信できる0-RTTが可能です。ただし、リプレイ攻撃のリスクがあるため、冪等なリクエスト(GET等)にのみ使用が推奨されます。
Step 6証明書の確認と実践
openssl で証明書を確認
# サーバー証明書の取得と表示
openssl s_client -connect example.com:443 -showcerts
# 証明書の詳細を表示
openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -text
# 有効期限の確認
openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
# 証明書チェーンの検証
openssl verify -CAfile ca-bundle.crt server.crt
curl でTLSバージョンを指定
# TLS 1.2で接続
curl --tlsv1.2 https://example.com
# TLS 1.3で接続
curl --tlsv1.3 https://example.com
# 使用された暗号スイートを表示
curl -v https://example.com 2>&1 | grep -i "SSL connection"
まとめ
- SSL/TLSは機密性・完全性・認証の3機能を提供
- 公開鍵暗号で鍵交換、共通鍵暗号でデータ暗号化(ハイブリッド方式)
- TLS 1.2ハンドシェイクは2-RTT、暗号スイートで方式を決定
- 証明書チェーン(ルートCA→中間CA→サーバー証明書)で信頼を検証
- TLS 1.3は1-RTT、PFS必須、脆弱な暗号の廃止で高速・安全
- 前方秘匿性(PFS)はECDHE等の一時鍵により過去の通信を保護