はじめに
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で検索しても良い回答が見つからない事が多いので、解決した状況を忘れないよう備忘録を残します。