サーバ証明書が更新されていなかった件

Let’s Encryptで取得したサーバ証明書がうまく自動更新できてていなかった。なお環境はDebian 7。

期限が20日と10日を切ると Let's Encrypt certificate expiration noticeという件名で期限が近いことをメールで知らせてくれた。ありがたい。

単にcronの設定を初歩的なミスで間違えていただけ。/etc/cron.d/certbotにchefでファイルを置くという運用をしていたが、個別のファイルにしたこともあってユーザのcrontabの設定と間違えてコマンドの実行ユーザを指定していなかった。それを直した次の日もcronはうまく実行できず、/usr/local/binにPATHが通ってなかったのでcertbot-autoコマンドが実行できていなかった。

とりあえず期限が迫ってきたのでおとなしく手動で実行したが、何故かaptnginxのパッケージの更新実行されて対話が必要だった。--no-self-upgradeを付けてもかわらなった。nginxが最新じゃないとだめだったりするのだろうか。

最新のドキュメント(Debian+Nginx)を見ると自動化はcronで以下の設定をしろと書いてある。見落としていたのか、いつの間にかコマンドが増えていたのか。

./path/to/certbot-auto renew --quiet --no-self-upgrade

ただ --force-renewal をつけてみたけどやっぱりnginxをreloadしないと反映されなかったので最終的に以下の設定にした。このブログは週末にアクセスが減るので日曜日に更新しておけばよいと思っている。

PATH=/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 5 * * 0 root certbot-auto renew --quiet --no-self-upgrade --post-hook "service nginx reload"

最初は && service nginx reload で繋いでいたけどrenewコマンドはデフォルトだと期限が近いもの(30日以内)しか更新されない。無駄なNginxの再読込が実行されてしまう恐れがあるので--post hookを使うのが良さげ。