事象
Xserver VPSやクラウド環境でCertbot(certbot --nginx など)を実行し、SSL/TLS証明書を取得しようとしたところ、ドメイン認証に失敗して次のエラーが表示された。
Certbot failed to authenticate some domains (authenticator: nginx). The Certificate Authority reported these problems:
Domain: example.com
Type: dns
Detail: DNS problem: SERVFAIL looking up A for example.com - the domain's nameservers may be malfunctioning; DNS problem: SERVFAIL looking up AAAA for example.com - the domain's nameservers may be malfunctioning
Hint: The Certificate Authority failed to verify the temporary nginx configuration changes made by Certbot. Ensure the listed domains point to this nginx server and that it is accessible from the internet.
Some challenges have failed.
環境
- Ubuntu / Linux
- Nginx
- Certbot (
python3-certbot-nginx) - 各種DNSサービス(Xserver DNS / お名前.com / Cloudflare 等)
- 独自ドメイン
原因
Let's Encryptの認証サーバー(ACMEサーバー)が、指定されたドメインの名前解決を行おうとした際に、DNSサーバーから SERVFAIL(Server Failure) が返されたことが原因である。
主な原因としては以下が挙げられる。
-
DNSレコード(Aレコード)が未登録、または誤ったIPを指している
ドメインを取得したばかりで、まだサーバーのグローバルIPアドレスを指すAレコードがDNSに設定されていない。 -
ネームサーバー(NS)の設定不備・浸透待ち
レジストラ(ドメイン管理会社)側で指定したネームサーバーが有効になっていない、またはDNS設定変更直後で世界中のキャッシュに反映されていない。 -
DNSSECの署名検証エラー
以前の環境でDNSSECを設定したままネームサーバーやDNSレコードを変更し、不整合が発生して検証に失敗している。
対策
1. DNSレコード(Aレコード・NSレコード)の現状を確認する
外部の名前解決ツールやコマンドラインから、ドメインが正しくIPアドレスに解決されるかを確認する。
# Aレコードの確認(IPが返ってくるか)
dig example.com A +short
# ネームサーバーの確認
dig example.com NS +short
もし何も返ってこない、あるいは SERVFAIL が返ってくる場合は、Certbotの実行を一旦止め、DNS側の設定を見直す。
2. DNS管理画面でAレコードを設定・確認する
ドメインを管理しているサービス(例: Xserver DNS設定パネル、Cloudflare等)を開き、対象ドメインのAレコードを登録・修正する。
| レコード種別 | ホスト名 | 設定値(内容) | TTL |
|---|---|---|---|
| A |
@(または空欄) |
サーバーのグローバルIPv4アドレス | 300〜3600 |
| A |
www(必要な場合) |
サーバーのグローバルIPv4アドレス | 300〜3600 |
※ 設定反映まで数分〜数時間かかる場合があるため、dig コマンド等で正しくIPが引けるようになるまで待つ。
3. Nginxの設定とポート開放(80/443)を確認する
CertbotがNginxプラグインで認証を通すためには、事前にドメイン宛てのHTTPアクセスがNginxに届いている必要がある。
Nginx設定(事前確認用)
# /etc/nginx/sites-available/example.conf
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
}
}
設定反映と構文チェック:
sudo nginx -t
sudo systemctl reload nginx
ファイアウォール・ポートの確認
サーバーおよびクラウド管理画面(セキュリティグループやパケットフィルター)で、80番(HTTP) および 443番(HTTPS) ポートがインターネットに向けて開放されているか確認する。
# UFWの場合
sudo ufw allow 'Nginx Full'
# または
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
4. 再度Certbotを実行する
DNSが正常に引けることを確認できたら、再度Certbotを実行して証明書を取得する。
sudo certbot --nginx -d example.com -d www.example.com
取得に成功した場合は、自動更新のシミュレーションテストも合わせて実施しておく。
sudo certbot renew --dry-run
Congratulations, all simulated renewals succeeded と表示されれば完了である。