acme验证超时本质是http-01无法访问80端口,需排查nginx是否监听80、配置是否匹配、有无强制https跳转、cdn拦截或安全规则阻止/.well-known路径。

验证超时不是证书问题,是ACME根本连不上你的80端口。Let’s Encrypt 在 HTTP-01 验证中必须通过 http://your-domain.com/.well-known/acme-challenge/xxx 访问挑战文件,这个请求走的是明文 HTTP(80端口),跟你的网站是否启用 HTTPS 完全无关。只要 80 端口不通、被占、被拦或返回非 200/404,验证就必然超时。
netstat/ss 查不到监听,但 curl localhost 返回 404?
这说明 Nginx 没在监听 80,或者监听了但没配对的 server 块响应请求。
- 执行
ss -tuln | grep :80,若无输出,确认 Nginx 是否已启动:systemctl status nginx - 若 Nginx 已运行但没监听 80,检查其主配置:
/www/server/nginx/conf/nginx.conf中是否有include vhost/*.conf;,且对应站点配置里写了listen 80; - 宝塔有时会把默认站点配置放在
/www/server/panel/vhost/nginx/0.default.conf,如果它监听 80 且未被覆盖,所有未匹配域名的请求都会落到它身上——此时你 curllocalhost得到的可能是“Welcome to nginx”,而非 404;但外部 CA 请求带 Host 头,反而可能 404 或超时
netstat 显示 nginx 占着 80,但 acme.sh 报 bind: address already in use
这不是端口冲突,而是宝塔调用的 acme.sh 尝试自己起一个临时 HTTP 服务来响应验证(某些旧版或异常配置下会这样),结果发现 80 已被占。
- 先确认你用的是哪种验证方式:进网站 SSL 页面 → 点「设置」→ 看「验证方式」是否为「HTTP 验证」;如果是,
acme.sh默认应复用 Nginx,不抢端口 - 执行
/www/server/panel/acme.sh --version,若报command not found或版本低于v3.0.0,说明插件损坏,需去「软件商店」→「Let's Encrypt」→「设置」→「重装插件」 - 重装后仍报 bind 错误,检查是否手动改过
/root/.acme.sh/acme.sh的配置,或存在残留的python -m http.server 80进程(ps aux | grep http.server)
curl -I http://your-domain.com/.well-known/acme-challenge/test 返回 403 或 502
这是最典型的伪静态/安全规则误杀,Nginx 收到了请求,但拒绝响应或转发失败。
- 检查站点配置文件(如
/www/server/panel/vhost/nginx/your-domain.com.conf)中是否存在类似location ^~ /.well-known/ { deny all; }的语句,删掉或改成allow all; - 确认没有全局启用「强制 HTTPS」301 跳转——HTTP-01 验证阶段禁止跳转,否则 CA 收到 301 就算失败
- 如果你开了 CDN(Cloudflare / 阿里云 CDN),必须临时关闭「Always Use HTTPS」、「Auto Minify」,并确保
/.well-known/acme-challenge/路径不缓存、不拦截;最稳妥做法是续签前把 DNS 解析直连服务器 IP
真正卡住的地方往往不在证书本身,而在那条从公网到 /.well-known/acme-challenge/ 的路径上——它要穿过云厂商安全组、宝塔防火墙、Nginx 配置、CDN 规则、甚至你加的一行 deny all。每层都得能透传,少一层,验证就断在半路。











