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
コマンドが実行できていなかった。
とりあえず期限が迫ってきたのでおとなしく手動で実行したが、何故かapt
でnginx
のパッケージの更新実行されて対話が必要だった。--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
を使うのが良さげ。