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アドレスが表示されていれば正常。