let’s encrypt 证书申请失败主因是 dns 验证未生效或 http-01 被强制 https 拦截;需确保 _acme-challenge txt 记录全球可查且未代理,或开放 80 端口并禁用跳转,再检查 nginx 配置加载与证书路径是否正确。

证书申请失败时,先确认 DNS 解析是否真正生效
宝塔面板申请 Let’s Encrypt 免费证书失败,八成卡在 DNS 验证环节。它不看你本地 ping 通不通,而是用 Let’s Encrypt 的全球验证节点查你域名的 _acme-challenge TXT 记录——这个记录必须被公开 DNS(比如阿里云、Cloudflare)正确返回,且 TTL 足够低(建议 ≤ 300 秒),否则验证直接超时。
常见错误现象:Failed to verify _acme-challenge.xxx.com 或日志里出现 Timeout during validation。
- 别只在自己电脑上
dig -t txt _acme-challenge.xxx.com @8.8.8.8,要换多个公共 DNS(如@1.1.1.1、@223.5.5.5)都查一遍 - 如果用 Cloudflare,确保该 TXT 记录的「代理状态」是灰色(DNS Only),不是橙色(Proxied)
- 阿里云/腾讯云后台修改后,等至少 5 分钟再重试,别手快点“立即申请”
- 宝塔里勾选了“自动添加 DNS 验证记录”,但你的 DNS 服务商不支持 API(比如自建 Bind 或某些小厂面板),这项功能实际无效
强制 HTTPS 拦截会直接阻断 ACME HTTP-01 验证
Let’s Encrypt 默认走 HTTP-01 验证(除非你手动切到 DNS-01),它需要从外网访问 http://xxx.com/.well-known/acme-challenge/xxx。如果你在宝塔或 Nginx 配置里写了强制跳转 HTTPS(比如 return 301 https://$host$request_uri),验证请求会被 301 重定向,而 Let’s Encrypt 不跟跳——结果就是 Connection refused 或 Invalid response。
- 检查站点配置文件中是否含
return 301 https或rewrite ^(.*)$ https://$host$1 permanent - 临时禁用强制 HTTPS:在宝塔「网站」→「设置」→「SSL」页,取消勾选「强制 HTTPS」;或手动注释掉 Nginx 配置里的跳转规则
- 申请成功后再打开强制 HTTPS,顺序不能反
- 若用 CDN(如 Cloudflare),也要关掉其「Always Use HTTPS」选项,否则它会在到达源站前就跳转
宝塔内置证书申请器的几个关键参数陷阱
宝塔 7.9+ 的「申请证书」按钮背后调用的是 acme.sh,但界面隐藏了部分关键逻辑,容易误操作。
- 「使用 DNS API」和「使用 HTTP 验证」不能混选:勾了 DNS 就别指望它去写
.well-known目录;反之,选 HTTP 就必须保证 80 端口开放、无拦截 - 泛域名(
*.xxx.com)必须选 DNS-01,HTTP-01 不支持;且需提前配置好对应 DNS 服务商的 API 凭据(如阿里云Ali_Key/Ali_Secret) - 「自动续签」默认开启,但若你中途改过 DNS 或关过 80 端口,下次自动续签仍会失败——得进
/www/server/panel/vhost/cert/xxx.com/手动跑一次acme.sh --renew -d xxx.com - 证书申请日志在
/www/server/panel/logs/acme.log,比宝塔界面上的提示详细得多
验证通过但证书没生效?检查 Nginx 配置加载是否真实完成
有时候宝塔显示“证书已签发”,但浏览器仍报 NET::ERR_CERT_INVALID,问题不在证书本身,而在 Nginx 没真正 reload 或配置路径写错。
- 确认站点配置里
ssl_certificate和ssl_certificate_key指向的是刚生成的文件,路径类似/www/server/panel/vhost/cert/xxx.com/fullchain.pem和privkey.pem,不是旧的或软链接失效的 - 执行
nginx -t看语法是否通过;再执行nginx -s reload,别只点宝塔界面上的「重载配置」按钮(偶有 UI 缓存) - 如果用了多端口或非标 SSL 配置(如监听 4443),宝塔可能没自动更新对应
server块,得手动补全ssl on和证书路径 - Chrome 浏览器缓存 HSTS 策略,哪怕你刚关掉强制 HTTPS,它仍会硬跳 HTTPS 并加载旧证书——可访问
chrome://net-internals/#hsts删除域名记录测试
最麻烦的不是哪步做错了,而是 DNS 生效延迟、CDN 缓存、本地 hosts 干扰、浏览器 HSTS 这几层叠加——它们不会报错,只会让你反复重试却看不出原因。










