Let's Encrypt SSL証明書の更新

今回は、Let's Encrypt のSSL証明書の更新方法を確認します。

はじめに

Let's Encryptにて提供される無償のSSL証明書はありがたいものです。
ただ、証明書の期間が約3ヶ月と短く、更新の10日くらい前になると、以下のようなメールがきます。

Let's Encrypt certificate expiration notice for domain "XXXXXXX"
Hello,
Your certificate (or certificates) for the names listed below will expire in 11 days (on 16 Jan 22 21:00 +0000). Please make sure to renew your certificate before then, or visitors to your web site will encounter errors.
We recommend renewing certificates automatically when they have a third of their total lifetime left. For Let's Encrypt's current 90-day certificates, that means renewing 30 days before expiration. See https://letsencrypt.org/docs/integration-guide/ for details.

Let's Encrypt Expiry Bot からのメール

2021年10月頃までは、"certbot-auto renew"で証明書を更新できたのですが、今回(2022年1月)はうまくいきません。

# certbot-auto renew
Your system is not supported by certbot-auto anymore.
certbot-auto and its Certbot installation will no longer receive updates.
You will not receive any bug fixes including those fixing server compatibility
or security problems.
Please visit https://certbot.eff.org/ to check for other alternatives.
Traceback (most recent call last):
  File "/opt/eff.org/certbot/venv/bin/letsencrypt", line 6, in <module>
    from pkg_resources import load_entry_point
ModuleNotFoundError: No module named 'pkg_resources'

これは、certbot-autoがバージョン1.11から全てのシステムで非推奨となった影響のようです。

https://github.com/certbot/certbot/releases/tag/v1.11.0

certbot-autoはPython2で書かれているようですが、Python2のEOL(サポート終了)に伴いPython3に移行しようとしたものの作業量が大きくて中断したことが理由のようです。

https://community.letsencrypt.org/t/certbot-auto-no-longer-works-on-debian-based-systems/139702/7

検証環境

今回の検証環境を以下に示します。

検証環境

  • サーバー:さくらVPS
  • OS:CentOS8(CentOS Linux release 8.5.2111)
  • Webサーバー:nginx1.14.1

以下を参考に証明書の更新作業を進めます。

https://certbot.eff.org/instructions?ws=nginx&os=centosrhel8

証明書更新環境の再構築作業

作業は、パッケージ管理システムsnap(yumやaptのようなもの)を使ってcertbotをインストールし証明書を更新します。

作業の流れは以下となります。

作業の流れ

  • 全パッケージのアップデート
  • snapとcertbotインストール
  • 証明書の更新と確認
  • 自動更新の設定
  • 後処理

全パッケージのアップデート

検証環境にはsnapが未インストールでしたので、インストール前に全パッケージをアップデートします。

以降は全てrootでの実施イメージです。

# yum update --nobest --nogpgcheck

今回の環境は、yum以外で導入したパッケージがあったことや、GPGキーエラーが発生したことから上記のようなオプションをつけて更新しました。

snapとcertbotのインストール

次に、snapとcertbotをインストールします。

# yum install -y snapd
# systemctl enable --now snapd.socket
# systemctl start snapd.service
# ln -s /var/lib/snapd/snap /snap
# snap install core && snap refresh core
# snap install certbot --classic
# ln -s /snap/bin/certbot /usr/bin/certbot

3行目までがsnapデーモンのインストールと起動、そのあとはsnapを使ったcertbotのインストールとなります。

certbot renewを、--dry-runオプション(演習モード)で実行し正常にインストールされたことを確認します。

# certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/XXXXXX.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Simulating renewal of an existing certificate for XXXXXX

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all simulated renewals succeeded: 
  /etc/letsencrypt/live/XXXXXX/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

この段階では、まだ証明書は更新されていません。(期限が2022年1月16日となっています)

# openssl x509 -in /etc/letsencrypt/live/XXXXXX/fullchain.pem -noout -dates
notBefore=Oct 18 21:00:40 2021 GMT
notAfter=Jan 16 21:00:39 2022 GMT

証明書更新

では、証明書を更新します。

# certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/XXXXXX.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Renewing an existing certificate for XXXXXX

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all renewals succeeded: 
  /etc/letsencrypt/live/XXXXXX/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

証明書の内容を確認すると、2022年4月6日まで延長されていますので更新成功です。

# openssl x509 -in /etc/letsencrypt/live/XXXXXX/fullchain.pem -noout -dates
notBefore=Jan  6 13:03:00 2022 GMT
notAfter=Apr  6 13:02:59 2022 GMT

自動更新の設定

自動更新は、以下のようにsnapを使って登録します。

$ sudo snap start --enable certbot.renew
$ sudo snap services
Service        Startup  Current   Notes
certbot.renew  enabled  inactive  timer-activated

ログを確認すると、7時間程度でcertbot.renewが起動されていることがわかります。

# snap logs certbot.renew
2022-01-07T06:48:14+09:00 systemd[1]: Starting Service for snap application certbot.renew...
2022-01-07T06:48:16+09:00 systemd[1]: snap.certbot.renew.service: Succeeded.
2022-01-07T06:48:16+09:00 systemd[1]: Started Service for snap application certbot.renew.
2022-01-07T13:56:14+09:00 systemd[1]: Starting Service for snap application certbot.renew...
2022-01-07T13:56:15+09:00 systemd[1]: snap.certbot.renew.service: Succeeded.
2022-01-07T13:56:15+09:00 systemd[1]: Started Service for snap application certbot.renew.

後処理

yumで導入したcertbotを削除します。

# rm -f /etc/cron.d/certbot-auto
# rm -rf /usr/local/certbot/

これで全ての作業が終了です。

まとめ

ここまで、Let's Encrypt のSSL証明書の更新方法を確認しました。

無償のSSL証明書はありがたいですが、無償なだけにメンテにはそれなりに労力がかかります。

ネット上にcertbotによる証明書更新の手順は様々ありますが、個別の環境問題で問題が出る場合もあるので、気をつけたいところです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

one + seventeen =