やりたかったこと
VPSで動かしているnginxにSSL証明書を設定して、HTTPSでアクセスできるようにしたかった。 Let’s Encryptの証明書はcertbotを使えば無料で取得できる。
certbotをインストールする
# Ubuntu / Debian
sudo apt update
sudo apt install -y certbot python3-certbot-nginx
SSL証明書を取得する
sudo certbot --nginx -d example.com -d www.example.com
対話形式で進む。メールアドレスを入力して、HTTPSへのリダイレクトを選ぶだけ。
Enter email address: your@email.com
(A)gree/(C)ancel: A
(Y)es/(N)o: N
Select the appropriate number [1-2]: 2
nginxの設定が自動で変わる
certbotがnginxの設定ファイルを自動で書き換えてくれる。
server {
listen 443 ssl;
server_name example.com www.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;
location / {
root /var/www/html;
index index.html;
}
}
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
証明書の自動更新
Let’s Encryptの証明書は90日で期限切れになる。certbotはsystemdタイマーで自動更新してくれる。
# 自動更新のテスト
sudo certbot renew --dry-run
# タイマーの状態を確認
sudo systemctl status certbot.timer
よく使うコマンド
# 証明書の一覧を見る
sudo certbot certificates
# 手動で証明書を更新
sudo certbot renew
# 特定の証明書を削除
sudo certbot delete --cert-name example.com
# nginxの設定構文チェック
sudo nginx -t
# nginxをリロード
sudo systemctl reload nginx
ハマったポイント
- ポート80が閉じていると証明書の取得に失敗する(ufwでポートを開けておく)
- Cloudflare経由の場合はオレンジ雲をグレー(DNSのみ)にしてからcertbotを実行する
www.ありとなしの両方を-dで指定しないと、片方がHTTPSにならないserver_nameが正しく設定されていないとcertbotがnginxを認識しない- VPSのIPとドメインのDNS設定が一致していないと失敗する
certbot実行前にUFWでポート80を開放しておく必要がある。LinuxのUFWファイアウォール設定の基本で sudo ufw allow 80 を確認してほしい。
関連記事
- nginxの基本的な設定ファイルの書き方
- nginx 502 Bad Gatewayエラーの原因と解決方法
- Linuxのファイアウォール設定(ufw)
- VPSでDockerを使う基本的なセットアップ
- SSHの基本的な使い方
おすすめのVPS/ドメイン
VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。