ICTSC2025 本戦 問題解説: [3331] Alternativeとは
問題文
概要
運用中のWebサーバにおいて、プライベート証明書の有効期限が近づいたため certbot renew コマンドによる更新処理を実行したところ、エラーが発生して失敗してしまった。
原因を究明し、証明書の更新が正常に行えるように修正してほしい。
制約
-
certbot以外のACMEクライアントソフトウェアは使用しないこと。 -
acmeサーバ側の設定変更は最小に留めること。
初期状態
web上でsudo certbot renewを実行すると、対象ドメインが見つからない旨のエラーが出力され、更新処理が失敗する。
終了状態
web上で証明書を適切な形式で再取得し、次回の更新テストとしてsudo certbot renewのようなコマンドを実行した際、エラーなく成功することが確認できる。
解説
現代のTLS規格では、検証にCNではなくSANを用いることが標準化されている。
certbotの renew コマンドは、管理下にある既存の証明書ファイルからSAN拡張フィールドを読み取り、更新対象となるドメイン名を特定する仕様になっている。そのため、過去の誤った手順や古い仕様で作成されたSANを持たない証明書が配置されていると、更新すべきドメイン名が認識できずエラーとなる。
解決策としては、該当ドメインに対して新たに証明書を取得し直す(もしくは、SANを含んだ証明書で上書き・再設定する)必要がある。
想定解法
-
Webサーバ上で
sudo certbot renewを実行し、エラーが発生して更新が失敗することを確認する。 -
現在読み込まれている証明書の内容をOpenSSLコマンドで確認する。
sudo openssl x509 -text -noout -in /etc/letsencrypt/live/web.ictsc2025.internal/cert.pem出力結果のSubjectに
CN = web.ictsc2025.internalは存在するが、X509v3 Subject Alternative Name拡張フィールドが存在しないことを確認する。 -
既存の証明書を使った
renewは不可能であるため、ドメイン名を明示して新たに証明書を取得し直す必要がある。以下のコマンドを実行し、証明書を新規取得する。
sudo certbot certonly --cert-name web.ictsc2025.internal --webroot -w /var/www/html -d web.ictsc2025.internal --server https://10.128.31.2/acme/acme/directoryが、ここでエラーが発生し、処理が失敗する。
ここのエラーから、発行プロセスにおけるHTTP-01チャレンジの通信に失敗していることを確認する。
-
acmeサーバから、webサーバに対する通信状況を確認する。
ping web.ictsc2025.internalここで疎通性がないことを確認する。
-
acmeサーバで名前解決ができるように修正する。
/etc/hostsにwebサーバのIPアドレスとドメインを追記する。echo "10.128.31.1 web.ictsc2025.internal" | sudo tee -a /etc/hosts -
設定後、再びwebサーバから証明書を再取得する。
sudo certbot certonly --cert-name web.ictsc2025.internal --webroot -w /var/www/html -d web.ictsc2025.internal --server https://10.128.31.2/acme/acme/directory -
新しく取得した証明書にSANが含まれているため、以後は通常の更新処理が可能になる。プライベートCA環境では
--dry-runが使用できないため、sudo certbot renew --force-renewalを実行して、エラーが出力されず、成功することを確認する。 -
Webサーバに新しい証明書を読み込ませるため、サービスを再起動またはリロードする。
sudo systemctl restart nginx
採点基準
-
/etc/letsencrypt/renewal/web.ictsc2025.internal.confのaccount = dummy_account_idを適切なアカウントに変更できている。: 20% -
acmeサーバでドメインの名前解決に失敗し、HTTP-01チャレンジができない状態であることを解答に記載している。: 20%
-
acmeサーバで名前解決の設定を修正した上で、webサーバでSANが含まれた証明書を再取得し、
sudo certbot renew --force-renewalが成功する状態に復旧できている。: 60%
講評
あくまで想定解法であり、別解あります。
ただ、論理立ててトラブルを解決するなら、想定解法が一番筋が通っているのではないかなという気持ち。