Let's EncryptとNginx(Certbot)
Certbotを使用してLet's Encryptの無料自動SSL/TLS証明書をNginxに設定する方法を解説。インストール、自動更新、ワイルドカード証明書、webrootモードに対応。
詳細な説明
Let's Encryptは、すべての主要ブラウザで信頼される無料の自動SSL/TLS証明書を提供します。Certbotクライアントと組み合わせることで、数分でNginxサーバーをHTTPSで保護し、証明書の更新ライフサイクル全体を自動化できます。
Certbotのインストール
# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx
# CentOS/RHEL
sudo dnf install certbot python3-certbot-nginx
証明書の取得
NginxプラグインはNginx設定を自動的に変更し、必要なSSLディレクティブを追加します:
sudo certbot --nginx -d example.com -d www.example.com
Certbotはチャレンジファイルを一時的に配信してドメインの所有権を検証し、証明書をインストールしてHTTPからHTTPSへのリダイレクトを自動設定します。
Webrootモード
Nginx設定の完全な手動制御を維持したい場合は、webrootモードを使用します。まずACMEチャレンジ検証用のlocationブロックを追加します:
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
次にNginx設定を変更せずに証明書をリクエストします:
sudo certbot certonly --webroot -w /var/www/certbot -d example.com
手動SSL設定
webrootモードで証明書を取得した後、Nginxで手動設定します:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
自動更新
Let's Encrypt証明書は自動化を促進するため、設計上90日で失効します。Certbotはsystemdタイマーをインストールし、失効前に証明書を自動更新します:
# 更新が正常に動作するか確認
sudo certbot renew --dry-run
# 更新タイマーの状態を確認
sudo systemctl status certbot.timer
更新後フック
証明書更新後、Nginxは新しい証明書ファイルをメモリにロードするためにリロードが必要です:
sudo certbot renew --deploy-hook "systemctl reload nginx"
ワイルドカード証明書
すべてのサブドメインをカバーするワイルドカード証明書はHTTPではなくDNSベースの検証が必要です:
sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.com
完全自動化されたワイルドカード更新には、certbot-dns-cloudflare や certbot-dns-route53 などのDNSプロバイダープラグインを使用し、手動介入なしで必要なDNS TXTレコードをプログラム的に作成します。
レート制限
Let's Encryptは登録ドメインあたり週50証明書のレート制限を適用しています。本番レート制限への意図しない到達を避けるため、初期テストと開発では必ずステージング環境(--staging フラグ)を使用してください。
ユースケース
新しいWebサイトのHTTPSを設定し、従来の認証局からの購入のコストと複雑さなしに、無料で自動更新されるSSL証明書を利用します。