cronでLet’s Encryptの証明書を自動的に更新する
Let’s Encryptの証明書を自動的に更新するためにcronを動かしていましたが、実はうまく動いておらず、更新ができていませんでした。そこでcronで自動的に更新するために気をつけるポイントをメモしました。
はじめに
Let’s Encryptは無料で利用できるSSL/TLS証明書です。当サイトでも使用させていただいています。証明書の有効期間は3か月で、定期的な更新が必要です。
当初は手動で
certbot renew
としていたのですが、さすがに面倒なので、cronによる自動化を試みてみました。
環境
- OS: CentOS8
- Webサーバ: nginx
cronの設定
当初の設定
毎月1日の午前4時に更新するよう、crontabを設定しました。
# crontab -l
0 4 1 * * certbot renew && systemctl reload nginx
これで自動更新されると期待していたのですが・・・
後日、「証明書がもうすぐ切れる」とLet’s Encryptからメールが来たことにより、certbot renew
が失敗して更新できていないことが明らかとなりました。
しかしながら、コマンドラインで直接
certbot renew && systemctrl reload nginx
とすると、問題なく証明書が更新されます。
なぜcronで同じコマンドを指定しても動かないのでしょうか?
エラーと原因
何が起こったのか見るために、ログを探ってみます。
ログは/var/log/letsencrypt/
以下にあるので、ここを見てみます。すると以下のような行が見つかりました。
2022-05-01 04:07:12,633:INFO:certbot._internal.main:Could not choose appropriate plugin: The nginx plugin is not working; there may be problems with your existing configuration.
The error was: NoInstallationError("Could not find a usable 'nginx' binary. Ensure nginx exists, the binary is executable, and your PATH is set correctly.",)
2022-05-01 04:07:12,634:ERROR:certbot._internal.renewal:Failed to renew certificate izadori.net-0001 with error: The nginx plugin is not working; there may be problems with your existing configuration.
The error was: NoInstallationError("Could not find a usable 'nginx' binary. Ensure nginx exists, the binary is executable, and your PATH is set correctly.",)
なんと「nginxが見つからない」と言っています。また、「nginxが実行可能ならPATHを正しくセットしろ」とも言っています。
ログに書かれている通り、cronで動かすときに、nginx
へのパスが通っていなかったことが原因でした。
更新後の設定
nginx
は/sbin
または/usr/sbin
以下にあるので、ここにパスを通しておきます。
PATHの設定はcrontab内に直接書くことができます。
# crontab -l
PATH=/sbin:/bin:/usr/sbin:/usr/bin
0 4 1 * * certbot renew && systemctl reload nginx
ディスカッション
コメント一覧
まだ、コメントがありません