Let's Encryptの更新に失敗した原因と対処法

運営していたマストドンインスタンスのSSL証明書をLet's Encryptを利用していたのですが、CRONにしかけた定期更新で失敗していました。

試しに手動で実行したところ、次のようなメッセージが表示され失敗していしまいます。

1
Attempting to renew cert from /etc/letsencrypt/renewal/everydon.com.conf produced an unexpected error: Problem binding to port 443: Could not bind to IPv4 or IPv6.. Skipping.

原因と対処法

ググって調べたところ、原因はNginx起動中だと更新がうまくいかないためとのことでした。

今までのCRONの設定では、更新したあとにNginxを再起動する順序にしていたので、この現象が発生しました。

なので、

  1. Nginx停止
  2. Let's Encryptの更新
  3. Nginx開始

という順序で行ったところ正常に更新できました。コマンドにすると以下のような感じです。

1
2
3
4
$ sudo systemctl stop nginx
$ ~/certbot-auto renew
$ sudo systemctl start nginx

CRONには例えば次のように書きます。

1
0 6 * * 6 sudo systemctl stop nginx && ~/certbot-auto renew && sudo systemctl start nginx

参考記事