このガイドでは、NginxにSSL証明書をインストールする手順を解説します。ファイルのアップロードからTLS設定の最適化、一般的なエラーのトラブルシューティングまでをカバーします。GetHTTPS、Certbot、その他のソースからの証明書で動作します。
証明書をまだ持っていない場合は、5分で無料で取得できます。
前提条件
- Nginxがインストールされ、HTTPでサイトを提供中(ポート80)
- root/sudoアクセス
- 証明書ファイル — 2つ必要:
fullchain.pem— 証明書 + 中間チェーン(結合済み)privkey.pem— 秘密鍵
どのファイルがどれ? GetHTTPSは4つのファイルを提供します。Nginxには
fullchain.pem(cert.pemではない)とprivkey.pemが必要です。cert.pemだけを使うと、ブラウザが信頼チェーンを検証できず「不完全なチェーン」エラーが発生します。証明書フォーマットの説明 →
ステップ1:証明書ファイルをサーバーにアップロード
sudo mkdir -p /etc/ssl/gethttps
sudo cp fullchain.pem /etc/ssl/gethttps/
sudo cp privkey.pem /etc/ssl/gethttps/
sudo chmod 600 /etc/ssl/gethttps/privkey.pem
sudo chmod 644 /etc/ssl/gethttps/fullchain.pem
sudo chown root:root /etc/ssl/gethttps/*
ステップ2:HTTPSサーバーブロックを設定
推奨の完全設定:
# HTTPSサーバーブロック
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
# ─── 証明書ファイル ───────────────────────
ssl_certificate /etc/ssl/gethttps/fullchain.pem;
ssl_certificate_key /etc/ssl/gethttps/privkey.pem;
# ─── TLSプロトコルと暗号スイート ────────────────
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
# ─── セッションキャッシュ(パフォーマンス) ───────────
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# ─── OCSPステープリング(高速な検証) ─────
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# ─── セキュリティヘッダー ────────────────────────
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;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
# HTTPリダイレクトブロック
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
ステップ3:設定をテスト
sudo nginx -t
ステップ4:Nginxをリロード
sudo systemctl reload nginx
restart ではなく reload を使用してください。 リロードは既存の接続を切断せずに新しい設定を適用します — ダウンタイムゼロです。
ステップ5:証明書を検証
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates -ext subjectAltName
SSL Labs Server Testで包括的なレポートを取得。目標:グレードAまたはA+。
更新方法
証明書の有効期限が近づいたら(Let’s Encryptの90日中60日目):
- GetHTTPSから新しい証明書を取得
- ファイルを置き換え:
sudo cp new-fullchain.pem /etc/ssl/gethttps/fullchain.pem sudo cp new-privkey.pem /etc/ssl/gethttps/privkey.pem - Nginxをリロード:
sudo systemctl reload nginx
トラブルシューティング
”SSL: error:0B080074” — 証明書ルーチンエラー
原因: fullchain.pem ではなく cert.pem を使用しています。
修正: ssl_certificate を fullchain.pem に変更:
ssl_certificate /etc/ssl/gethttps/fullchain.pem; # cert.pemではない
“cannot load certificate key” — 鍵を読み込めない
原因: 秘密鍵ファイルのパーミッションが間違っている、ファイルが破損している、または鍵が証明書と一致しません。
ls -la /etc/ssl/gethttps/privkey.pem
sudo openssl ec -in /etc/ssl/gethttps/privkey.pem -check
HTTPSは動作するが「保護されていない通信」と表示
原因: 混合コンテンツ — ページが http:// で画像、スクリプト、CSSを読み込んでいます。
修正: DevTools(F12)→ コンソール → 「Mixed Content」警告を確認。すべてのリソースURLを https:// または相対パスに更新してください。
よくある質問
HTTPとHTTPSで別々の設定ファイルが必要ですか?
いいえ。両方の server ブロック(ポート80と443)を同じファイルに入れてください。HTTPブロックはHTTPSへのリダイレクトのためだけに存在します。
ssl on; を使うべきですか?
いいえ。ssl on; は非推奨です。代わりに listen 443 ssl; を使用してください。
reload と restart の違いは?
reload は既存の接続を切断せずに新しい設定を適用します。restart はプロセスを停止・開始し、すべての接続を一時的に切断します。証明書の変更には常に reload を使用してください。
NginxはECDSA/ECC証明書に対応していますか?
はい。NginxはECDSA証明書をRSAとまったく同じように扱います。同じディレクティブ、同じファイルフォーマットです。GetHTTPSはデフォルトでECDSA P-256を生成します(鍵が小さく、ハンドシェイクが高速)。