「certbotのエラーでSSL/TLSが更新できない」問題点と対策

python

はじめに

cronでcertbot(letsencrypt)を定期更新しているとcertbotがエラーで動かずに証明書期限切れになったことはありませんか?

certbotをバッチ処理させて証明書を更新することは難しくありませんが、
脆弱性対策としてパッケージを自動更新しているとpythonの依存関係が壊れることがあり、Webサイトのhttpsとして運用しているとサービス停止にもつながるため恒久的な対策を共有します。

前提条件

OSに寄与する依存関係への対策

  • 以下の条件を確認する
    • pipでインストールしたいパッケージが依存しているOSのパッケージがインストール済みである(例えばaptやdnfのpython3-xxxx パッケージ)
    • pythonをユーザー権限で管理している(pyenv or venv でpythonを管理している)
    • pyenvやvenvの環境で、pythonのバージョンやパッケージを自由にインストールできるようにする
    • pipを最新版に更新している
    • snapdを無効化している
    • python2.x系のパッケージが混在しないように必要なパッケージだけに整理している

問題点1:pipのエラーで更新ができない、実行してもエラーになる

エラーメッセージ「ModuleNotFoundError: No module named 'pip'」

ModuleNotFoundError: No module named 'pip'

対策1-1:pipを最新版へ更新する

pip install pip -U

対策1-2:pipでpipを更新してもエラーになる場合はget-pip.pyを使う

curl -o get-pip.py https://bootstrap.pypa.io/get-pip.py
python ./get-pip.py

問題点2:certbotを実行するとエラーで動かない

対策2-1:certbotが動かない場合は "too many failed authorizations recently" が発生していないかどうかログを確認する

certbot / letsencrypt の規定では1時間に5回以上、同一ドメインから更新の要求が発生すると、利用上限を超えたと判別して最大48時間、certbotでの更新を拒否されることになる。
※2023年10月現在の規定なので、最新情報は以下URLを参照

Failed Validation Limit
Description All issuance requests are subject to a Failed Validation limit of 5 failures per account, per hostname, per ...

対策2-2:certbotのプログラムが正常に動作していない(パッケージに問題がある)

certbotが更新できなくなる不具合はパッケージの再インストールで直る場合が多い

環境にも依存するのだが、certbot等のパッケージ依存のソフトウェアで、特定のPythonモジュールが原因で動作しなくなった場合は、パッケージ再インストールで直る場合が多い。

例えば、ubuntu22.04の環境でpython3.10系を利用している当方の環境だと、以下のパッケージがcertbotに関連していたので、これらを一括削除して一括で再インストールすれば最短で復旧させることができた。

certbotをパッケージの再インストールで復旧させる手順
  • certbotが依存するパッケージリストのテキストファイルを作成する
vim mycertbotpkgs.txt
pyopenssl
crypto
certbot
certbot-nginx
pyOpenSSL
acme
configargparse
parsedatetime
pyparsing
  • pipでrオプションを利用して一括でアンインストールする

    pip uninstall -r mycertbotpkgs.txt
    
  • pipでrオプションを利用して一括でインストールする

    pip install -r mycertbotpkgs.txt
    
  • 動作確認

    sudo certbot
    

パッケージ依存に問題があればエラーが表示される。
問題がなければ正しく動作するハズ。


雑感

こういったバッドノウハウはChatGPTやGoogleで検索しても良い回答が見つからない事が多いので、解決した状況を忘れないよう備忘録を残します。