Let's EncryptのSSL証明書更新処理がエラーになった場合の対処

HOMEリナックスマスター.JP 公式ブログLinuxエラー対処法 > Let's EncryptのSSL証明書更新処理がエラーになった場合の対処
宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「certbot renew を実行したら急にエラーになった」
「自動更新のcronが止まっていて、証明書の期限が迫っている」

Let's Encryptの証明書は90日で期限が切れます。更新スクリプトがエラーで止まっていると、気づいたときにはサイトが証明書エラーで表示されなくなっています。
本番サーバーでの証明書期限切れはサービス停止に直結するため、エラーが出たら即日対処が必要です。

この記事では、実際に遭遇したcertbot更新エラーとその対処手順を解説します。
CentOS 7環境での「OSError: setuptools pip wheel failed」の実際のエラーログと修正コマンド、さらに現在のRHEL 9系・Ubuntu環境でよく発生するトラブルシュートも合わせて掲載します。

無料SSL証明書として有名なLet's Encryptを使用していて、証明書更新処理で下記エラーが発生しました。
自動更新処理でも同様のエラーが発生していました。

■エラーログ
OSError: Command /opt/eff.org/certbot/venv/bin/python2.7 - setuptools pip wheel failed with error code 1

この記事のポイント

・certbot-autoのPython 2.7エラーはpython-pip+pip upgradeで解消できる
・certbot-autoは現在非推奨。EPELまたはsnapで導入するのが現在の標準
・certbot renew --dry-runで実際に更新せず動作確認が可能
・「Too many certificates」エラーは--stagingオプションで発行制限を回避できる
・openssl x509コマンドで証明書の有効期限を直接確認できる

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

発生した状況と実行ログの詳細

certbot-autoのrenewコマンドを実行したところ、下記のような実行ログとともにエラーが発生しました。
エラーの核心は最終行のOSErrorですが、その手前で「python-pip は利用できません」というyumのメッセージが出ており、これが直接の原因です。

■実行ログ

# certbot-auto renew --force-renew --dry-run && systemctl restart nginx.service Bootstrapping dependencies for RedHat-based OSes... (you can skip this with --no-bootstrap) yum は /bin/yum です yum はハッシュされています (/bin/yum) 読み込んだプラグイン:fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: ftp.iij.ad.jp * extras: ftp-srv2.kddilabs.jp * rpmforge: ftp.kddilabs.jp * updates: ftp.iij.ad.jp パッケージ gcc-4.8.5-36.el7.x86_64 はインストール済みか最新バージョンです パッケージ augeas-libs-1.4.0-6.el7_6.1.x86_64 はインストール済みか最新バージョンです パッケージ 1:openssl-1.0.2k-16.el7.x86_64 はインストール済みか最新バージョンです パッケージ 1:openssl-devel-1.0.2k-16.el7.x86_64 はインストール済みか最新バージョンです パッケージ libffi-devel-3.0.13-18.el7.x86_64 はインストール済みか最新バージョンです パッケージ redhat-rpm-config-9.1.0-87.el7.centos.noarch はインストール済みか最新バージョンです パッケージ ca-certificates-2018.2.22-70.0.el7_5.noarch はインストール済みか最新バージョンです パッケージ python-devel-2.7.5-76.el7.x86_64 はインストール済みか最新バージョンです パッケージ python-virtualenv-15.1.0-2.el7.noarch はインストール済みか最新バージョンです パッケージ python-tools-2.7.5-76.el7.x86_64 はインストール済みか最新バージョンです パッケージ python-pip は利用できません。 何もしません Creating virtual environment... Traceback (most recent call last): File "/usr/lib/python2.7/site-packages/virtualenv.py", line 2327, in main() File "/usr/lib/python2.7/site-packages/virtualenv.py", line 712, in main symlink=options.symlink) File "/usr/lib/python2.7/site-packages/virtualenv.py", line 944, in create_environment download=download, File "/usr/lib/python2.7/site-packages/virtualenv.py", line 900, in install_wheel call_subprocess(cmd, show_stdout=False, extra_env=env, stdin=SCRIPT) File "/usr/lib/python2.7/site-packages/virtualenv.py", line 796, in call_subprocess % (cmd_desc, proc.returncode)) OSError: Command /opt/eff.org/certbot/venv/bin/python2.7 - setuptools pip wheel failed with error code 1

エラーの原因と対処手順

このエラーはcertbot-autoが内部で使用するPython 2.7の仮想環境(virtualenv)を再構築しようとした際に、python-pipがシステムにインストールされていないために発生します。
CentOS 7のデフォルトリポジトリにはpython-pipが含まれていないため、EPELリポジトリから別途インストールする必要があります。

対処としては、EPELリポジトリ経由でpython-pipをインストールし、その後pipと関連ツールをアップグレードします。

■対処手順

# EPELリポジトリからpython-pipをインストール # yum --enablerepo=epel install python-pip # pipと関連ツールをアップグレード # pip install --upgrade setuptools # pip install --upgrade virtualenv # pip install --upgrade pip

上記を実行した後、改めてcertbot-auto renew --dry-runを実行すると、更新処理が正常に動作するようになりました。

なお、対処後は取得済み証明書の一覧を確認して、更新状態が正常かチェックしておくと安心です。

# 取得済み証明書の一覧と有効期限を確認 $ sudo certbot certificates Found the following certs: Certificate Name: example.com Domains: example.com www.example.com Expiry Date: 2026-08-30 00:00:00+00:00 (VALID: 84 days) Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem

【重要】certbot-autoは現在非推奨

運用上の重要な注意点を一つ挙げておきます。

certbot-autoは2021年にEFF(Electronic Frontier Foundation)による公式サポートが終了しており、現在は非推奨です。
また、CentOS 7のサポートも2024年6月に終了しているため、本番サーバーをまだCentOS 7で運用している場合は、OSのアップグレードを強く推奨します。

現在の標準的なcertbotの導入方法は以下の通りです。

Rocky Linux 9 / AlmaLinux 9(EPELリポジトリ経由)

# EPELリポジトリを追加 $ sudo dnf install epel-release -y # certbotとNginxプラグインをインストール $ sudo dnf install certbot python3-certbot-nginx -y # Apacheの場合はこちら $ sudo dnf install certbot python3-certbot-apache -y # バージョン確認 $ certbot --version certbot 2.11.0

Ubuntu 24.04 LTS(snap経由)

# snapでcertbotをインストール(EFF公式推奨方法) $ sudo snap install --classic certbot # コマンドへのシンボリックリンクを作成 $ sudo ln -s /snap/bin/certbot /usr/bin/certbot # バージョン確認 $ certbot --version certbot 2.11.0

snap版certbotはインストール時にsystemd timerが自動で登録されます。
snap版を使っている場合はsudo snap refresh certbotでいつでも最新バージョンに更新できます。

certbot renew --dry-runで自動更新を事前テストする

証明書の更新処理が正常に動作するかどうかは、--dry-runオプションで確認できます。
実際には証明書を書き換えず、更新処理のシミュレーションだけ行うため、運用中のサーバーへの影響がありません。

# 更新処理のシミュレーション(実際には証明書を書き換えない) $ sudo certbot renew --dry-run - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/example.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - Simulating renewal of an existing certificate for example.com Congratulations, all simulated renewals succeeded: /etc/letsencrypt/live/example.com/fullchain.pem (success) - - - - - - - - - - - - - - - - - - - - - - - - - - -

Congratulationsと表示されれば、自動更新の準備は完了です。
cronまたはsystemd timerから定期実行されていれば、以降は手動操作なしで90日ごとに自動更新されます。

自動更新の設定状況はsystemd timerで確認できます。

# certbot用のsystemd timerが登録されているか確認 $ sudo systemctl list-timers | grep certbot Tue 2026-06-04 01:20:00 JST 13h left certbot-renew.timer certbot-renew.service

timerが表示されない場合は、cronで代替します。

# rootのcrontabに追加(毎日3時と15時に更新チェック) $ sudo crontab -e 0 3,15 * * * /usr/bin/certbot renew --quiet

--quietを付けると正常時は出力を抑制し、エラー時のみcronの標準エラー出力(メール通知)に出力されます。
更新後はWebサーバーが新しい証明書を読み込むためにsystemctl reload nginxが必要な点も忘れずに設定してください。

証明書ファイルの有効期限はopensslコマンドで直接確認できます。サーバー上で証明書を直接確認したい場合に便利です。

# 有効期限を直接確認(notBeforeとnotAfterが表示される) $ openssl x509 -noout -dates -in /etc/letsencrypt/live/example.com/cert.pem notBefore=Jun 1 00:00:00 2026 GMT notAfter=Aug 30 00:00:00 2026 GMT # 30日以内に期限切れかチェック(期限内なら "Certificate will not expire" と出力) $ openssl x509 -noout -checkend $((30*86400)) -in /etc/letsencrypt/live/example.com/cert.pem Certificate will not expire

その他のよくあるエラーと対処

1. 「Connection timed out」が出て取得・更新できない

Let's Encryptのサーバーがポート80(または443)に到達できていない状態です。
ファイアウォールやクラウドのセキュリティグループでポートが閉じていると発生します。

# ファイアウォールの確認(Rocky Linux 9) $ sudo firewall-cmd --list-services dhcpv6-client http https ssh # httpが表示されない場合は追加 $ sudo firewall-cmd --add-service=http --permanent $ sudo firewall-cmd --reload

AWSのEC2など、クラウド環境ではセキュリティグループのインバウンドルールでポート80が開放されているかも確認してください。

2. 「Too many certificates already issued」エラー

Let's Encryptには同一ドメインへの証明書発行レート制限(1週間に5枚まで)があります。
テスト・開発中に繰り返し取得し直すと上限に達します。

テスト用にはステージング環境を使うことで制限を回避できます。ステージング証明書はブラウザで「安全でない」と表示されるため本番には使えませんが、動作確認には使えます。

# ステージング環境で証明書取得(レート制限なし・テスト用) $ sudo certbot --nginx --staging -d example.com

3. 更新後にWebサーバーへ反映されない

証明書は更新されても、WebサーバーがSSLファイルをキャッシュし続ける場合があります。
更新後に自動でリロードするには--deploy-hookを使います。

# 更新成功時にNginxを自動リロード $ sudo certbot renew --deploy-hook "systemctl reload nginx" # Apacheの場合 $ sudo certbot renew --deploy-hook "systemctl reload httpd"

本番運用では/etc/letsencrypt/renewal-hooks/deploy/にシェルスクリプトを置く方法が推奨です。certbotが更新するたびにそのスクリプトを自動実行します。

4. 証明書の期限が切れてしまった後の強制更新

証明書の有効期限が切れてしまった場合、通常のrenewコマンドでは更新が実行されないことがあります。
--force-renewalオプションで残り日数に関係なく強制更新してください。

# 残り日数に関係なく強制更新 $ sudo certbot renew --force-renewal # 特定のドメインのみ強制更新 $ sudo certbot renew --cert-name example.com --force-renewal # 更新後はWebサーバーをリロードして新しい証明書を読み込ませる $ sudo systemctl reload nginx

本記事のまとめ

certbot更新エラーの原因と対処をまとめます。

エラー・症状 主な原因 対処コマンド
OSError: setuptools pip wheel failed python-pipが未インストール(CentOS 7) yum --enablerepo=epel install python-pip && pip install --upgrade setuptools virtualenv pip
Connection timed out ポート80/443が閉じている firewall-cmd --add-service=http --permanent && firewall-cmd --reload
Too many certificates already issued レート制限(1週間に5枚)に達した certbot --nginx --staging -d example.com
更新後にWebサーバーへ反映されない WebサーバーがSSLファイルをキャッシュ certbot renew --deploy-hook "systemctl reload nginx"
期限切れ後に更新できない 自動更新が止まっていた certbot renew --force-renewal
更新の動作確認をしたい (テスト実行) certbot renew --dry-run
証明書の有効期限を確認したい (期限確認) openssl x509 -noout -dates -in /etc/letsencrypt/live/example.com/cert.pem
取得済み証明書の一覧を確認したい (状態確認) certbot certificates
Let's Encryptの証明書更新エラーは、原因さえ特定できれば一つひとつ対処できます。
まずはcertbot renew --dry-runで現状を確認し、エラーメッセージに応じた対処を行ってください。
本番サーバーの運用では、systemd timerまたはcronで定期実行されていることを定期的に確認する習慣が重要です。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Linuxサーバー構築入門マニュアル(図解60P)を無料でお渡ししています。

>> Linuxサーバー構築入門マニュアル(図解60P)を無料で受け取る

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。


Linux無料マニュアル(図解60P) 名前とメールで30秒登録