使用Let's Encrypt Certbot申请证书遇404授权失败,但验证文件存在
问题描述
我尝试使用Let's Encrypt为网站申请SSL证书,执行命令:
docker run -it --rm -v "$PWD"/letsencrypt:/etc/letsencrypt certbot/certbot certonly --manual -d yourdomain.com
却收到错误提示:
Certbot failed to authenticate some domains (authenticator: manual). The Certificate Authority reported these problems: Domain: yourdomain.com Type: unauthorized Detail: 2a01:7c*******f:feb8:1cae: Invalid response from http://yourdomain.com/.well-known/acme-challenge/dY_t**********PbmOrhH668mU: 404
我的Web服务器正常运行,无论在本机还是其他服务器使用curl访问该验证URL,都能成功获取对应内容:
$ curl http://yourdomain.com/.well-known/acme-challenge/dY_tTYlo88******OrhH668mU dY_tTYlo88ZrcXCkM8uGL*******OMlOBp7dMgBs7d0epjyo
请问为何Certbot会出现验证失败的情况?
可能的原因及解决方案
1. IPv6解析与配置问题
错误信息中显示的是IPv6地址,说明Let's Encrypt验证服务器优先通过IPv6访问你的域名,但你的服务器IPv6链路存在问题:
- 域名DNS配置了AAAA记录,但Web服务器未监听IPv6的80端口,或防火墙/安全组未开放IPv6的80端口
- 你本地或测试服务器默认使用IPv4访问,所以curl能成功,但Let's Encrypt的IPv6请求无法获取到验证文件
解决方法:
- 若无需IPv6,可临时删除域名的AAAA记录,重新执行Certbot命令
- 若需保留IPv6,确保Web服务器配置监听IPv6端口(比如Nginx需添加
listen [::]:80;),同时开放防火墙的IPv6 80端口规则
2. 验证文件的访问限制
虽然你能访问验证文件,但Let's Encrypt的验证请求可能被Web服务器的权限规则拦截:
- 检查Web服务器访问日志,查看Let's Encrypt请求的具体状态和拦截原因
- 确保
.well-known/acme-challenge/目录及下属文件对所有访客可读,删除该路径下的htaccess、Nginx location限制等规则
3. CDN或反向代理缓存问题
若网站使用了CDN或反向代理,可能缓存了旧的404响应,或未同步刚放置的验证文件:
- 临时禁用CDN缓存,或手动清除
.well-known/acme-challenge/路径的缓存 - 确认CDN回源配置正确,能直接拉取到你服务器上的验证文件
4. 网络层面的IPv6限制
服务器所在网络可能对IPv6入站/出站流量有拦截,导致Let's Encrypt的验证请求无法正常到达:
- 使用支持IPv6的外部测试站点,验证你的验证URL是否能被IPv6访问
- 联系服务器提供商确认IPv6网络链路是否正常
内容的提问来源于stack exchange,提问作者Jeanluca Scaljeri
相关产品推荐
相关产品推荐

