SSL/TLS証明書管理
所要時間
約40分
学べること
- SSL/TLS証明書の基本概念とライフサイクル
- 証明書の種類と選び方(DV、OV、EV、ワイルドカード)
- Let's Encryptによる無料証明書の取得と自動更新
- OpenSSLを使用した証明書検証
- 証明書の更新とローテーション戦略
- SSL/TLSのトラブルシューティング
前 提知識
- content_11_learning/12-crypto/pki-certificates.md - PKIと証明書の基礎
- content_11_learning/09-http-rest/https-tls-basics.md - HTTPS/TLS基礎
- DNSの基本理解
1. SSL/TLS証明書の基礎
1.1 証明書の役割
┌─────────────────────────────────────────────────────────────┐
│ SSL/TLS証明書の3つの役割 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 認証(Authentication) │
│ - サーバーの身元を証明 │
│ - 「このサイトは本当にexample.comか?」 │
│ │
│ 2. 暗号化(Encryption) │
│ - 通信内容の保護 │
│ - 盗聴防止 │
│ │
│ 3. 完全性(Integrity) │
│ - データ改ざん検知 │
│ - 中間者攻撃(MITM)防止 │
│ │
└─────────────────────────────────────────────────────────────┘
1.2 証明書の構造
┌─────────────────────────────────────────────────────────────┐
│ X.509証明書の構造 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Certificate: │
│ Data: │
│ Version: 3 (0x2) │
│ Serial Number: 1234567890abcdef │
│ Signature Algorithm: sha256WithRSAEncryption │
│ Issuer: CN=DigiCert SHA2 Secure Server CA │
│ Validity │
│ Not Before: Jan 1 00:00:00 2025 GMT │
│ Not After : Jan 1 23:59:59 2026 GMT │
│ Subject: CN=example.com │
│ Subject Public Key Info: │
│ Public Key Algorithm: rsaEncryption │
│ Public-Key: (2048 bit) │
│ Modulus: 00:c0:ff:ee:... │
│ Exponent: 65537 (0x10001) │
│ X509v3 extensions: │
│ X509v3 Subject Alternative Name: │
│ DNS:example.com, DNS:www.example.com │
│ X509v3 Key Usage: │
│ Digital Signature, Key Encipherment │
│ X509v3 Extended Key Usage: │
│ TLS Web Server Authentication │
│ Signature Algorithm: sha256WithRSAEncryption │
│ 12:34:56:78:9a:bc:de:f0:... │
│ │
└─────────────────────────────────────────────────────────────┘
重要フィールド:
Subject (CN - Common Name)
- 証明書の主体(ドメイン名)
- 例: CN=example.com
Issuer
- 発行者(認証局)
- 例: CN=Let's Encrypt Authority X3
Validity (有効期間)
- Not Before: 有効開始日時
- Not After: 有効終了日時
Subject Alternative Name (SAN)
- 複数のドメイン名を含められる
- 例: example.com, www.example.com, api.example.com
2. 証明書の種類
2.1 検証レベル別の分類
┌─────────────────────────────────────────────────────────────┐
│ 証明書の検証レベル │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. DV (Domain Validation) 証明書 │
│ - ドメイン所有権のみ検証 │
│ - 数分〜数時間で発行 │
│ - 最も安価(無料のものも多い) │
│ - Let's Encrypt、ZeroSSL等 │
│ 用途: 個人サイト、開発環境、ほとんどのWebサイト │
│ │
│ 2. OV (Organization Validation) 証明書 │
│ - ドメイン所有権 + 組織の実在性を検証 │
│ - 数日で発行 │
│ - 中程度の価格 │
│ 用途: 企業サイト、Eコマース │
│ │
│ 3. EV (Extended Validation) 証明書 │
│ - 最も厳格な検証(法人登記等の確認) │
│ - 数日〜数週間で発行 │
│ - 高価 │
│ - ブラウザのアドレスバーに組織名表示(古いブラウザ) │
│ 用途: 金融機関、大規模Eコマース │
│ │
└─────────────────────────────────────────────────────────────┘
2.2 スコープ別の分類
┌─────────────────────────────────────────────────────────────┐
│ 証明書のスコープ │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 単一ドメイン証明書 │
│ - 1つのFQDNのみ │
│ - 例: example.com │
│ - www.example.com は別証明書が必要 │
│ │
│ 2. ワイルドカード証明書 │
│ - 1階層のサブドメインをカバー │
│ - 例: *.example.com │
│ - カバー: www.example.com, api.example.com │
│ - 非カバー: example.com, sub.api.example.com │
│ │
│ 3. マルチドメイン証明書 (SAN証明書) │
│ - 複数の異なるドメインをカバー │
│ - 例: example.com, example.org, example.net │
│ - SANフィールドに複数のドメインを記載 │
│ │
└─────────────────────────────────────────────────────────────┘
2.3 証明書選択のガイドライン
シナリオ別の推奨証明書:
┌────────────────────┬──────────────┬─────────────────┐
│ ユースケース │ 推奨証明書 │ 理由 │
├────────────────────┼──────────────┼─────────────────┤
│ 個人ブログ │ DV │ コスト、簡便性 │
│ │ (Let's Encrypt)│ │
├────────────────────┼──────────────┼─────────────────┤
│ 企業Webサイト │ DV or OV │ 信頼性とコスト │
│ │ │ のバランス │
├────────────────────┼──────────────┼─────────────────┤
│ Eコマース │ OV or EV │ 顧客信頼 │
├────────────────────┼──────────────┼─────────────────┤
│ 金融機関 │ EV │ 最高レベルの信頼 │
├────────────────────┼──────────────┼─────────────────┤
│ 多数のサブドメイン │ ワイルドカード│ 管理簡略化 │
└────────────────────┴──────────────┴─────────────────┘
3. 証明書の取得方法
3.1 証明書取得の選択肢
SSL/TLS証明書を取得する一般的な方法:
┌─────────────────────────────────────────────────────────────┐
│ 証明書取得方法の比較 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 商用認証局(CA) │
│ - DigiCert、GlobalSign、Sectigo等 │
│ - 有料(年間数千円〜数万円) │
│ - OV/EV証明書が必要な場合 │
│ - サポートが充実 │
│ │
│ 2. Let's Encrypt(無料CA) │
│ - 完全無料のDV証明書 │
│ - 自動化対応(ACME プロトコル) │
│ - 有効期間90日(自動更新推奨) │
│ - 個人サイト、開発環境に最適 │
│ │
│ 3. 自己署名証明書 │
│ - OpenSSLで自作 │
│ - 開発/テスト環境のみ │
│ - ブラウザ警告が表示される │
│ - 本番環境では使用不可 │
│ │
└─────────────────────────────────────────────────────────────┘
3.2 自己署名証明書の作成(開発/テスト用)
OpenSSLを使用して自己署名証明書を作成する方法:
# 1. 秘密鍵の生成
openssl genrsa -out server.key 2048
# 2. CSR(証明書署名要求)の生成
openssl req -new -key server.key -out server.csr
# 対話形式で以下を入力:
# Country Name (2 letter code) []:JP
# State or Province Name []:Tokyo
# Locality Name []:Minato
# Organization Name []:Example Corp
# Organizational Unit Name []:IT Department
# Common Name []:example.com
# Email Address []:admin@example.com
# 3. 自己署名証明書の生成(有効期間365日)
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
# 4. ワンライナーで生成(対話なし)
openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes \
-subj "/C=JP/ST=Tokyo/L=Minato/O=Example Corp/OU=IT/CN=example.com"
# 5. SANを含む証明書の生成(複数ドメイン対応)
cat > san.cnf <<EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no
[req_distinguished_name]
C = JP
ST = Tokyo
L = Minato
O = Example Corp
OU = IT
CN = example.com
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = api.example.com
EOF
openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes -config san.cnf -extensions v3_req
# 注意: 自己署名証明書は開発/テスト専用。本番環境では使用しないこと