クラウド環境で運用するウェブシステムにおいて、SSL証明書の管理は重要なセキュリティ対策の一つです。
特に無料で利用できるLet’s Encryptは多くの開発者やシステム管理者に活用されていますが、自動更新がうまく機能せず、証明書の期限切れによるアクセスエラーが発生することがあります。
本記事では、AWS EC2環境で発生したLet’s Encrypt証明書の更新エラーとその解決方法について詳しく解説します。
特にポート80が既に使用されている状況での対処法に焦点を当てます。
証明書期限切れエラー
ある日、管理システムにアクセスしようとしたところ、ブラウザに「ERR_CERT_DATE_INVALID」というエラーが表示されました。
これはSSL証明書の期限が切れていることを示すエラーです。
1 |
Failed to load resource: net::ERR_CERT_DATE_INVALID |
このエラーが表示されると、ユーザーは警告メッセージを目にすることになり、セキュリティ上の懸念から多くの場合アクセスを中止してしまいます。
そのため、迅速な対応が求められます。
証明書の状態確認
まず、現在の証明書の状態を確認するために、サーバーで以下のコマンドを実行します。
1 2 |
# 証明書の状態確認 certbot certificates |
1 2 3 4 5 6 7 8 9 10 11 12 |
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Found the following certs: Certificate Name: example.com Serial Number: 12345abcde6789fghij0123456789abcde Key Type: ECDSA Domains: example.com Expiry Date: 2025-06-07 13:04:54+00:00 (INVALID: EXPIRED) Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
上記の結果から、証明書が「INVALID: EXPIRED」(無効:期限切れ)の状態であることが確認できました。
Let’s Encryptの証明書は通常90日間有効で、その後更新が必要になります。
更新エラーの原因
証明書の更新を試みるために、以下のコマンドを実行しました。
1 2 |
# 証明書の更新 certbot renew |
しかし、以下のようなエラーメッセージが表示されました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/example.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Renewing an existing certificate for example.com Failed to renew certificate example.com with error: Could not bind TCP port 80 because it is already in use by another process on this system (such as a web server). Please stop the program in question and then try again. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - All renewals failed. The following certificates could not be renewed: /etc/letsencrypt/live/example.com/fullchain.pem (failure) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 renew failure(s), 0 parse failure(s) |
このエラーメッセージから、ポート80が既に他のプロセス(通常はウェブサーバー)によって使用されているため、certbotが証明書の更新に必要な認証チャレンジを実行できないことがわかりました。
自動更新タイマーの状態も確認しましょう。
1 2 |
# certbotタイマーの状態確認 systemctl status certbot.timer |
1 2 3 4 5 6 |
Warning: The unit file, source configuration file or drop-ins of certbot.timer changed on disk. Run 'systemctl daemon-reload' to reload units. ● certbot.timer - Run certbot twice daily Loaded: loaded (/usr/lib/systemd/system/certbot.timer; enabled; preset: enabled) Active: active (waiting) since Fri 2025-09-09 06:49:17 UTC; 3 months 5 days ago Trigger: Thu 2024-11-14 18:45:34 UTC; 9h left Triggers: ● certbot.service |
タイマーは正常に設定されているものの、実際の更新処理ではポート80の使用権限の問題で失敗していることが判明しました。
ウェブルート方式への変更
Let’s Encryptの証明書更新方式には、主にスタンドアロン方式とウェブルート方式があります。
スタンドアロン方式はcertbot自身がポート80を使用して認証を行うため、既にウェブサーバーが稼働している環境では競合が発生します。
これを解決するには、ウェブルート方式に変更することで、ウェブサーバーを停止せずに証明書の更新が可能になります。
1 2 |
# ウェブルート方式での証明書更新 certbot certonly --webroot -w /var/www/html -d example.com --force-renewal |
※ /var/www/html
の部分は実際のウェブルートディレクトリに合わせて変更してください。
この方法では、.well-knownディレクトリにチャレンジファイルを配置し、Let’s Encryptの認証サーバーがそのファイルにアクセスすることで所有権の確認を行います。
設定ファイルの編集
更新方式を恒久的に変更するには、certbotの設定ファイルを編集します。
1 2 |
# 設定ファイルの編集 nano /etc/letsencrypt/renewal/example.com.conf |
ファイル内で以下の行を探し、変更または追加します。
1 2 3 4 5 6 |
# 変更前 authenticator = standalone # 変更後 authenticator = webroot webroot_path = /var/www/html |
さらに、システムユニットファイルの変更を反映するために以下のコマンドを実行します。
1 2 |
# systemdの設定再読み込み systemctl daemon-reload |
設定変更後、以下のコマンドで更新処理のテストを行います。
1 2 |
# 更新のドライラン(実際には更新しない) certbot renew --dry-run |
問題がなければ、実際の更新を実行します。
1 2 |
# 証明書の更新 certbot renew |
一時的なウェブサーバー停止
上記の方法が実装できない場合や、他の理由でウェブルート方式が使用できない場合は、更新時だけ一時的にウェブサーバーを停止する方法もあります。
1 2 3 4 5 6 7 8 |
# ウェブサーバーの停止 systemctl stop nginx # または apache2 # 証明書の更新 certbot renew # ウェブサーバーの再開 systemctl start nginx # または apache2 |
この方法はシンプルですが、更新中に短時間サービスが停止するため、可能であれば前述のウェブルート方式を検討してください。
自動更新の設定確認
Let’s Encryptの証明書は90日間有効であり、通常は有効期限の30日前から更新できるようになります。
certbotのタイマーが正しく設定されているか以下のコマンドで確認します。
1 2 |
# タイマー設定の確認 systemctl list-timers certbot.timer |
タイマーが有効になっていれば、定期的に更新コマンドが実行されますが、今回のようにポート80の問題があると更新に失敗します。そのため、前述の解決方法で更新方式を変更することが重要です。
更新後は、ウェブサーバーを再起動して新しい証明書を読み込ませます。
1 2 |
# ウェブサーバーの再起動 systemctl restart nginx # または apache2 |
まとめ
Let’s Encryptの証明書更新エラーは、主にポート80の競合が原因で発生します。
- ウェブルート方式への変更
ウェブサーバーを停止せずに証明書を更新する最も推奨される方法 - 設定ファイルの編集
恒久的に更新方式を変更して自動更新を確実にする方法 - 一時的なウェブサーバー停止
他の方法が使用できない場合の代替策
これらの対策を実施することで、SSL証明書の期限切れによるサービス障害を防ぎ、セキュアな接続を維持することができます。
定期的な監視と適切な更新方式の選択が、安定したウェブサービス運用の鍵となります。
SSL証明書管理の自動化は、システム管理者の負担を軽減し、エラーを防止するために重要です。
本記事が皆様のシステム運用の一助となれば幸いです。
コメント