SSL証明書完全ガイド

目次

SSL/TLSとは

SSL(Secure Sockets Layer)とその後継であるTLS(Transport Layer Security)は、インターネット上の通信を保護する暗号化プロトコルです。HTTPSサイトにアクセスすると、TLSがブラウザとサーバー間の接続を暗号化し、盗聴や改ざんを防ぎます。

仕組み

TLSハンドシェイクは以下の手順で安全な接続を確立します:

  1. Client Hello — ブラウザが対応するTLSバージョンと暗号スイートを送信
  2. Server Hello — サーバーがバージョン/暗号を選択し、証明書を送信
  3. 証明書の検証 — ブラウザが証明書を検証(発行元、有効期限、ドメイン一致)
  4. 鍵交換 — 双方が共有セッション鍵を導出
  5. 暗号化通信 — 以降のすべてのトラフィックが暗号化される

証明書チェーン

ルートCA
  └─ 中間CA
      └─ エンドエンティティ証明書(あなたのサイト)

ブラウザは組み込みのルートCAリストを信頼しています。証明書チェーンをたどって信頼されたルートに到達することで、あなたの証明書を検証します。

証明書の種類

検証レベル別

DV — ドメイン認証

ドメインの所有権のみを検証。数分で発行。Let's Encryptで無料取得可能。ほとんどのWebサイトに適しています。

OV — 組織認証

ドメインの所有権に加え、組織の身元を検証。発行に1〜3営業日。ビジネスサイトに適しています。

EV — 拡張認証

最も厳格な検証 — 法人確認、電話確認。発行に1〜2週間。銀行や大規模ECサイトで使用。注意:2019年以降、主要ブラウザは緑色の組織名バーを表示しなくなりました。

カバー範囲別

証明書の確認方法

ブラウザ

アドレスバーの鍵アイコンをクリック → 証明書の詳細を表示:発行先、発行元、有効期限。

コマンドライン

# 証明書情報を表示
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

オンラインツール

よくあるエラー

証明書の期限切れ — 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;