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を含んだ証明書で上書き・再設定する)必要がある。

想定解法

  1. Webサーバ上で sudo certbot renew を実行し、エラーが発生して更新が失敗することを確認する。

  2. 現在読み込まれている証明書の内容をOpenSSLコマンドで確認する。
    sudo openssl x509 -text -noout -in /etc/letsencrypt/live/web.ictsc2025.internal/cert.pem

    出力結果のSubjectに CN = web.ictsc2025.internal は存在するが、X509v3 Subject Alternative Name 拡張フィールドが存在しないことを確認する。

  3. 既存の証明書を使った 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チャレンジの通信に失敗していることを確認する。

  4. acmeサーバから、webサーバに対する通信状況を確認する。

    ping web.ictsc2025.internal
    

    ここで疎通性がないことを確認する。

  5. acmeサーバで名前解決ができるように修正する。
    /etc/hosts にwebサーバのIPアドレスとドメインを追記する。

    echo "10.128.31.1 web.ictsc2025.internal" | sudo tee -a /etc/hosts
    
  6. 設定後、再び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
    
  7. 新しく取得した証明書にSANが含まれているため、以後は通常の更新処理が可能になる。プライベートCA環境では --dry-run が使用できないため、sudo certbot renew --force-renewalを実行して、エラーが出力されず、成功することを確認する。

  8. Webサーバに新しい証明書を読み込ませるため、サービスを再起動またはリロードする。sudo systemctl restart nginx

採点基準

  • /etc/letsencrypt/renewal/web.ictsc2025.internal.confaccount = dummy_account_id を適切なアカウントに変更できている。: 20%

  • acmeサーバでドメインの名前解決に失敗し、HTTP-01チャレンジができない状態であることを解答に記載している。: 20%

  • acmeサーバで名前解決の設定を修正した上で、webサーバでSANが含まれた証明書を再取得し、sudo certbot renew --force-renewal が成功する状態に復旧できている。: 60%

講評

あくまで想定解法であり、別解あります。

ただ、論理立ててトラブルを解決するなら、想定解法が一番筋が通っているのではないかなという気持ち。