Let's Encryptの証明書を自動で更新する方法

はじめに

先日、仕事で作成させていただいたWebサイトにアクセスできなくなっていました。

原因は、Let's Encryptの証明書自動更新方法に不備があったことでした。

今回はLet's Encryptの証明書自動更新方法について記載します。

暫定対処

Webサイトにアクセスできない状況が長時間続くのはまずいので、調査などは後回しにして暫定対処を行いました。

VPSサーバーに接続し、以下のコマンドを実行しました。

# service nginx restart

これでWebサイトにアクセスできるようになりました。

原因

原因を調査したところ、証明書の更新は行われていましたが、稼働中のWebサーバーに反映されていないことが判明しました。

VPSサーバー上で以下のコマンドを実行したら有効期限は数カ月先になっているのに、Webブラウザでアクセスしたら有効期限が切れていることになっていたのです。

# 有効期限を確認するコマンド
$ certbot-auto certificates

証明書の更新を行ったらWebサーバーを再起動して反映させる必要があります。証明書の更新は行われていましたので、その後のWebサーバー再起動がうまくいっていないことが原因だと考えました。

恒久対処

Webサーバーの再起動がうまくいっていないことが原因だと書きましたが、実は証明書の更新後のWebサーバー再起動はちゃんと設定してあります。

以下がもともと設定してあったcronです。/etc/cron.d/letsencryptに設定しています。

0 0 * * * root /home/user/certbot/certbot-auto renew --post-hook "/sbin/service nginx reload" >> /etc/cron.d/letsencrypt.log
  • 0 0 * * * root:毎日00時00分にrootユーザーで実行します。
  • /home/user/certbot/certbot-auto renew:証明書更新コマンドです。
  • --post-hook "/sbin/service nginx reload":証明書更新後のWebサーバー再起動コマンドです。
  • >> /etc/cron.d/letsencrypt.log:ログ出力です。今回は関係ありません。

このWebサーバー再起動コマンドは間違っています。reloadではなくrestartを使う必要があります。

これを踏まえて以下のように変更しました。

0 4 1 * * root /home/user/certbot/certbot-auto renew --post-hook "/sbin/service nginx restart" >> /var/log/letsencrypt.log
  • 0 4 1 * * root:ついでに毎月1日の04時00分に変更。
  • /home/user/certbot/certbot-auto renew:変更箇所なし。
  • --post-hook "/sbin/service nginx restart":コマンド引数をrestartに変更。
  • >> /var/log/letsencrypt.log:ついでにログ出力先を変更。

これで証明書更新後のWebサーバー再起動が正常に行われるはずです。

この状態でしばらく様子を見てみます。