cronでLet’s Encryptの証明書を自動的に更新する

Linux,サーバ

Let’s Encryptの証明書を自動的に更新するためにcronを動かしていましたが、実はうまく動いておらず、更新ができていませんでした。そこでcronで自動的に更新するために気をつけるポイントをメモしました。

はじめに

Let’s Encryptは無料で利用できるSSL/TLS証明書です。当サイトでも使用させていただいています。証明書の有効期間は3か月で、定期的な更新が必要です。

当初は手動で

certbot renew

としていたのですが、さすがに面倒なので、cronによる自動化を試みてみました。

環境

  1. OS: CentOS8
  2. 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

cron,Linux,サーバ

Posted by izadori