#ssl #nginx #apache
CertbotでSSL証明書を取得/更新する時、以下のプラグインから1つを選択する。
- apache
- インストール済みのApacheを利用する
- nginx
- インストール済みのNginxを利用する
- webroot
- 稼働中のWebサーバーのディレクトリを指定する
- standalone
- Webサーバーを利用しない
- 80番ポートを使用する
- DNS plugins
- DNSレコードを利用する
- ワイルドカード証明書を設定できる
- manual
- 説明に従って手動で行う
- 自動更新はサポートしない
Webサーバーの準備ができていない場合、しばしばstandaloneを選択することがあるが、後からNginxやApacheを起動してしまうと80番ポートが使えず更新に失敗する。
対策
1. プラグインをapache, nginxまたはwebrootに変更する
/etc/letsencrypt/renewal/*.conf
を以下のように編集して、プラグインを適切なものに変更することができる。
# nginxの場合
[renewalparams]
account = *****
authenticator = nginx
installer = nginx
server = https://acme-v02.api.letsencrypt.org/directory
key_type = ecdsa
# webrootの場合
[renewalparams]
authenticator = webroot
webroot-path = /var/www/example
www.example.com = /var/www/example
2. hooksを利用してWebサーバーを一時停止する
/etc/letsencrypt/renewal-hooks/(pre|post|deploy)
以下にスクリプトを配置すると、更新時に実行される。
- pre: 証明書の更新前に実行
- post: すべての証明書の更新が終わった後に実行
- deploy: それぞれの証明書の更新が終わる度に実行
WebサーバーがNginxの場合の例
更新前にNginxを停止する。
# /etc/letsencrypt/renewal-hooks/pre/stop_nginx.sh
#!/bin/bash
systemctl stop nginx
更新後にNginxを起動する。
# /etc/letsencrypt/renewal-hooks/post/start_nginx.sh
#!/bin/bash
systemctl start nginx
※ nginxプラグインの時にこれを行うとNginxのプロセスが重複してsystemctlがエラーになるので注意
スクリプトは --(pre|post|deploy)-hook
オプションで指定することもできる。
3. 仮想のwebrootを作る
https://zenn.dev/noraworld/articles/auto-renew-letsencrypt-for-nginx-reverse-proxies