やりたかったこと

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 を確認してほしい。

関連記事

おすすめのVPS/ドメイン

VPSを使って本番環境を構築するなら、以下のサービスがおすすめです。