SSL証明書完全ガイド
SSL/TLSとは
SSL(Secure Sockets Layer)とその後継であるTLS(Transport Layer Security)は、インターネット上の通信を保護する暗号化プロトコルです。HTTPSサイトにアクセスすると、TLSがブラウザとサーバー間の接続を暗号化し、盗聴や改ざんを防ぎます。
- 暗号化 — 通信中の機密データを保護
- 認証 — サーバーの身元を確認
- 完全性 — データが改ざんされていないことを保証
- SEO — GoogleはHTTPSをランキングシグナルとして使用
- 信頼性 — ブラウザはHTTPSサイトに鍵アイコンを表示
仕組み
TLSハンドシェイクは以下の手順で安全な接続を確立します:
- Client Hello — ブラウザが対応するTLSバージョンと暗号スイートを送信
- Server Hello — サーバーがバージョン/暗号を選択し、証明書を送信
- 証明書の検証 — ブラウザが証明書を検証(発行元、有効期限、ドメイン一致)
- 鍵交換 — 双方が共有セッション鍵を導出
- 暗号化通信 — 以降のすべてのトラフィックが暗号化される
証明書チェーン
ルートCA
└─ 中間CA
└─ エンドエンティティ証明書(あなたのサイト)
ブラウザは組み込みのルートCAリストを信頼しています。証明書チェーンをたどって信頼されたルートに到達することで、あなたの証明書を検証します。
証明書の種類
検証レベル別
DV — ドメイン認証
ドメインの所有権のみを検証。数分で発行。Let's Encryptで無料取得可能。ほとんどのWebサイトに適しています。
OV — 組織認証
ドメインの所有権に加え、組織の身元を検証。発行に1〜3営業日。ビジネスサイトに適しています。
EV — 拡張認証
最も厳格な検証 — 法人確認、電話確認。発行に1〜2週間。銀行や大規模ECサイトで使用。注意:2019年以降、主要ブラウザは緑色の組織名バーを表示しなくなりました。
カバー範囲別
- シングルドメイン — 1つのドメインをカバー(例:
www.example.com) - ワイルドカード — すべてのサブドメインをカバー(例:
*.example.com) - マルチドメイン(SAN) — 1つの証明書で複数の異なるドメインをカバー
証明書の確認方法
ブラウザ
アドレスバーの鍵アイコンをクリック → 証明書の詳細を表示:発行先、発行元、有効期限。
コマンドライン
# 証明書情報を表示
openssl s_client -connect example.com:443 -servername example.com
# 有効期限を確認
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| openssl x509 -noout -dates
オンラインツール
- SSL Labs — 包括的なSSL設定テスト
- 301check.com — リダイレクトチェーンの各ホップのTLS情報を表示
- crt.sh — 証明書透明性ログの検索
よくあるエラー
証明書の期限切れ — NET::ERR_CERT_DATE_INVALID
証明書を更新してください。Certbotの自動更新を使用すれば防げます。
ドメイン不一致 — NET::ERR_CERT_COMMON_NAME_INVALID
証明書がアクセスしているドメインをカバーしていません。正しいドメインの証明書を取得するか、ワイルドカード証明書を使用してください。
不完全なチェーン — NET::ERR_CERT_AUTHORITY_INVALID
中間証明書がサーバー設定に含まれていません。
# Nginx — cert.pemではなくfullchain.pemを使用
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
混合コンテンツ
HTTPSページがHTTPリソース(画像、スクリプト、スタイルシート)を読み込んでいます。すべてのリソースURLをHTTPSに更新するか、プロトコル相対URL(//example.com/image.jpg)を使用してください。
Let's Encrypt
Let's Encryptは、非営利団体ISRGが運営する無料・自動・オープンな認証局です。HTTPSをすべての人に利用可能にしました。
Certbot(推奨)
# Ubuntu/Debianにインストール
sudo apt install certbot python3-certbot-nginx
# 証明書の発行とNginxの自動設定
sudo certbot --nginx -d example.com -d www.example.com
# 自動更新のテスト
sudo certbot renew --dry-run
# 自動更新のcron設定
0 0,12 * * * certbot renew --quiet
acme.sh(軽量な代替手段)
curl https://get.acme.sh | sh
acme.sh --issue -d example.com -d www.example.com --nginx
ベストプラクティス
# Nginx — 強力なTLS設定
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
# HSTSを有効化
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# OCSPステープリング
ssl_stapling on;
ssl_stapling_verify on;
- 証明書の有効期限アラートを設定(30日前)
- CAA DNSレコードを使用して、ドメインに証明書を発行できるCAを制限
- 証明書透明性ログを監視し、不正な発行を検出
- SSL Labsで設定をテスト