LetsEncryptを設定する際に用いるcertbotが次のようなエラーを出した際に対処した内容をメモする。

Hint: The Certificate Authority failed to verify the temporary Apache configuration changes made by Certbot. Ensure that the listed domains point to this Apache server and that it is accessible from the internet.

Some challenges have failed.
Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.

letsencrypt.logを参照する

まずはメッセージ通り/var/log/letsencrypt/letsencrypt.logを参照してエラーの内容を確認する。このファイルはsudo付きのcertbotコマンドによって作成されたと思われるため必要に応じて閲覧時にもsudoを使用するなどする。すると末尾で下記のようなメッセージが確認された

2024-01-14 19:16:27,451:INFO:certbot._internal.auth_handler:Challenge failed for domain mydomain.com 
2024-01-14 19:16:27,451:INFO:certbot._internal.auth_handler:http-01 challenge for  mydomain.com

http-01とは

そこでHTTP-01とは何かについて調べながら.logのより上部を参照する。すると次のような流れによってサーバの素性を確認するものだとわかった。

  • certbotはLetsEncryptサーバと通信しhttp-01チャレンジの開始をトリガする
  • LetsEncryptサーバはcertbotに対してトークンを送信する
  • certbotはsudo権限で被認証サーバの指定URLでトークンを出力するようにApacheの設定を一時的に変更する
  • LetsEncryptサーバは被認証サーバの指定URLにアクセスしてトークンが出力されることを確認する
  • certbotはApacheの一時的な設定をもとに戻す

以上によってサーバの素性確認が完了すると残る認証プロセスに移る。ここで被認証サーバとはエラー例におけるmydomain.comのことを指す。Apacheの一時的な設定が行われている内容はletsencrypt.log上では次のようになっていた。

2024-01-14 19:16:23,026:DEBUG:certbot_apache._internal.http_01:Adding a temporary challenge validation Include for name: mydomain.com in: /etc/apache2/sites-enabled/000-default.conf
2024-01-14 19:16:23,026:DEBUG:certbot_apache._internal.http_01:writing a pre config file with text:
         RewriteEngine on
        RewriteRule ^/\.well-known/acme-challenge/([A-Za-z0-9-_=]+)$ /var/lib/letsencrypt/http_challenges/$1 [END]

2024-01-14 19:16:23,026:DEBUG:certbot_apache._internal.http_01:writing a post config file with text:
         <Directory /var/lib/letsencrypt/http_challenges>
            Require all granted
        </Directory>
        <Location /.well-known/acme-challenge>
            Require all granted
        </Location>

このアクセスのログがApache側に残っていればエラーの内容が確認できるだろう。Apacheのログは通常/var/log/apacheにある。Apacheのログに.well-known/acme-challenge関連のアクセスログがない場合はポート転送の設定が間違っていてLetsEncrypt認証サーバから被認証サーバに対するhttp経由の接続ができていないなどが考えられる。Apache側の設定はcertbotがうまいことやるだろうからこのケースが大半。

no valid A records found for

このログは下記のようにLetsEncrypt認証サーバのレスポンスメッセージとして受信したものをそのまま表示したものと思われる。

"type": "http-01",
      "status": "invalid",
      "error": {
        "type": "urn:ietf:params:acme:error:dns",
        "detail": "no valid A records found for mydomain.com; no valid AAAA records found for mydomain.com",
        "status": 400
      },

この場合はmydomain.comを

など、DNSレコードの状態をWAN側からチェックできるウェブサイトにmydomain.comを打ち込んでみるのが良いだろう。後者のunboundtestの場合はANSWER SECTIONにWAN側のIPアドレスが表示されていれば正常。