Certbotのstandaloneで取得したSSL証明書が更新できない問題
#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