SSL/TLSの設定は大幅に変化しました。これは2026年現在のベストプラクティスの最新状況です — 有効にすべきもの、無効にすべきもの、今後の変更について解説します。
プロトコルバージョン
| プロトコル | ステータス | アクション |
|---|---|---|
| SSL 2.0, 3.0 | 破損 | 無効化 — 重大な脆弱性(POODLE、DROWN) |
| TLS 1.0 | 非推奨(2021年) | 無効化 — BEAST脆弱性 |
| TLS 1.1 | 非推奨(2021年) | 無効化 — 最新暗号非対応 |
| TLS 1.2 | 安全 | 有効化 — AEAD暗号のみ |
| TLS 1.3 | 現在の標準 | 有効化 — 最速、最も安全 |
Nginx: ssl_protocols TLSv1.2 TLSv1.3;
Apache: SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
暗号スイート
TLS 1.3(設定不要)
5つの暗号スイートすべてが安全です。カスタマイズしようとしないでください — これ以上良くはできません。
TLS 1.2(AEADのみに制限)
# Nginx
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off;
ルール:
ECDHE-*スイートのみ — 前方秘匿性を確保*-GCM-*または*-CHACHA20-*のみ — AEAD暗号のみ- CBC暗号なし — BEAST、Lucky13に脆弱
ssl_prefer_server_ciphers off— クライアントに選択させる(最新クライアントが最適を選択)
証明書管理
| プラクティス | 理由 |
|---|---|
| ECDSA P-256鍵を使用 | RSA 2048より小さく高速 |
| 更新を自動化 | 2029年までに47日の有効期間で手動更新が非現実的に |
fullchain.pemを配信 | 証明書チェーンエラーを防止 |
| 証明書の有効期限を監視 | 90日中60日目にアラートを設定 |
| 証明書の透明性を監視 | 不正な証明書をキャッチ |
| 更新時に鍵をローテーション | 証明書間で秘密鍵を再利用しない |
セキュリティヘッダー
# HSTS -- 常にHTTPSを使用(短いmax-ageから始め、後で増やす)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
# MIMEタイプスニッフィングを防止
add_header X-Content-Type-Options "nosniff" always;
# クリックジャッキングを防止
add_header X-Frame-Options "SAMEORIGIN" always;
# 安全でないサブリソースをアップグレード
add_header Content-Security-Policy "upgrade-insecure-requests" always;
パフォーマンス最適化
| 設定 | 設定値 | メリット |
|---|---|---|
| HTTP/2 | listen 443 ssl http2; | 多重化、ヘッダー圧縮 |
| セッションキャッシュ | ssl_session_cache shared:SSL:10m; | 再訪問者のハンドシェイク回避 |
| セッションチケットオフ | ssl_session_tickets off; | 前方秘匿性の向上 |
| OCSPステープリング | ssl_stapling on; | 高速な証明書検証、プライバシー向上 |
| 早期データ(0-RTT) | TLS 1.3デフォルト | ゼロ遅延の再開(慎重に使用) |
完全なNginx設定(本番対応)
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
root /var/www/html;
}
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
テスト: SSL Labsにドメインを貼り付けてください — この設定で**A+**が取れるはずです。
やってはいけないこと
| 悪い慣行 | 理由 | 代わりにすべきこと |
|---|---|---|
ssl_protocols TLSv1 TLSv1.1; | 非推奨、脆弱 | TLS 1.2 + 1.3のみ |
ssl_ciphers ALL; | 弱い暗号を含む | 明示的なECDHE + AEADリスト |
ssl_prefer_server_ciphers on;(TLS 1.3) | 不要 — TLS 1.3暗号はすべて安全 | off |
fullchain.pemの代わりにcert.pemを使用 | チェーン欠落 → 信頼エラー | Nginxには常にfullchain.pem |
| 本番で自己署名証明書 | ブラウザ警告、信頼なし | Let’s Encrypt(無料) |
| 同じ秘密鍵を何年も使用 | 被害封じ込めを制限 | 更新ごとにローテーション |
| HSTSなし | ダウングレード攻撃に脆弱 | テスト後に有効化 |
HSTSのmax-age=0 | 実質的にHSTSを無効化 | 300から始め、63072000に増やす |
よくある質問
SSL設定をテストするにはどうすればいいですか?
SSL Labs Server Test — ドメインを入力し、文字評価(A-F)の詳細レポートを取得。プロトコルサポート、暗号強度、チェーンの有効性、既知の脆弱性を確認します。
どのグレードを目標にすべきですか?
本番サイトにはA+。必要なもの:TLS 1.2以上のみ、AEAD暗号、有効なチェーン、長いmax-ageのHSTS。上記の設定でA+が達成できます。
SSL設定をどのくらいの頻度でレビューすべきですか?
年に一度、または新しい脆弱性が発表されたとき。Let’s Encryptのステータスページを購読し、Mozilla SSL Configuration Generatorで最新の推奨事項を確認してください。
正しい設定を生成してくれるツールはありますか?
はい — Mozilla SSL Configuration Generator。サーバー(Nginx、Apacheなど)とバージョンを選択すると、推奨設定が生成されます。「Modern」プロファイルがこの記事のプラクティスに一致します。