Certbot验证失败关键在DNS解析、80端口可达性及Web服务响应:需用dig @8.8.8.8确认A记录指向正确IP,curl测试http://domain/.well-known/acme-challenge/test应返回404而非超时或502,且Nginx必须有专用location配置并正确指向token目录。

排查 Certbot 验证域名所有权失败,关键不是“重试”,而是确认 Let’s Encrypt 能否真实访问到你的域名对应服务。验证失败几乎都卡在 DNS 解析、端口可达性或 Web 服务响应这三步上。
检查 DNS 解析是否生效且无污染
Let’s Encrypt 用的是全球任意节点的 DNS 查询(比如 Google 的 8.8.8.8),不是你本地电脑的缓存结果。运行以下命令验证:
-
查 A/AAAA 记录是否指向当前服务器 IP:
dig +short example.com @8.8.8.8或nslookup example.com 1.1.1.1 -
查有没有 NXDOMAIN 错误:如果返回空或
server can't find example.com: NXDOMAIN,说明 DNS 未配置或未生效;常见于新注册域名未设置 NS、DNS 修改未过 TTL、或用了内网 DNS 未同步到公网 -
警惕解析污染:同一台服务器多个域名时,若
aa.com和bb.com共享二级域(如都属example.com),某些 DNS 服务商可能缓存错误记录,导致 ACME 挑战请求被导向错误站点
确认 80 端口可被 Let’s Encrypt 访问
HTTP-01 验证方式要求 Let’s Encrypt 的服务器能通过公网访问 http://example.com/.well-known/acme-challenge/xxx。它不走 HTTPS,只走 80 端口。
-
本地测试能否访问挑战路径:
curl -I http://example.com/.well-known/acme-challenge/test—— 应返回 404(路径不存在但端口通);若超时、拒绝连接或返回 502/503,说明 Nginx 未监听 80、防火墙拦截、或反向代理链路中断 -
检查 Nginx 是否监听 80:
ss -tlnp | grep ':80',确认有nginx进程绑定*:80 - 云服务器务必检查安全组/ACL:阿里云、腾讯云等默认关闭 80 端口入方向,需手动放行;本地测试通 ≠ Let’s Encrypt 能通
验证 Nginx 是否正确响应 ACME 挑战文件
Certbot 默认用 --nginx 插件时会自动改配置,但若中途失败或手动改过配置,容易漏掉 location ^~ /.well-known/acme-challenge/ 块。
-
检查对应 server 块中是否有 ACME 专用 location:
grep -A 5 'acme-challenge' /etc/nginx/sites-enabled/example.com,应类似:
location ^~ /.well-known/acme-challenge/ {
root /var/www/html;
default_type "text/plain";
}
-
确保 root 路径存在且可读:
ls -l /var/www/html/.well-known/acme-challenge/;Certbot 会把 token 写进去,Nginx 必须能从该目录读取 -
避免 rewrite 或 proxy_pass 干扰:如果该 location 被其他
location ~ \.php$或全局rewrite规则覆盖,挑战文件将无法返回纯文本
看日志定位具体失败点
不要只看终端报错,Certbot 日志更准:
-
查看最近一次失败详情:
sudo tail -30 /var/log/letsencrypt/letsencrypt.log - 典型错误含义:
-
urn:acme:error:unauthorized→ DNS 或 HTTP 响应内容不匹配(比如返回了 Nginx 默认页、跳转到 HTTPS、或返回 HTML 而非纯文本) -
DNS problem: NXDOMAIN looking up A for example.com→ DNS 根本没解析到 IP -
Connection refused或timeout→ 80 端口不通,或中间有 WAF/CDN 拦截了.well-known路径
-


















