AWS EC2使用certbot续期SSL证书报http-01挑战失败404错误
AWS EC2上Certbot续期SSL证书报http-01挑战404的排查方案
http-01验证返回404的核心逻辑是Let's Encrypt的验证节点请求/.well-known/acme-challenge/路径下的校验文件时,没有拿到预期的校验内容,结合你使用nginx认证插件、EC2运行环境,按以下顺序逐一排查即可解决:
- 先核对证书绑定的域名拼写
你贴的报错日志中,待验证的域名出现mydmain.com、mydoamin.com这类拼写错误,和你预期的mydomain.com不一致。先执行sudo certbot certificates查看所有已签发证书对应的域名列表,把拼写错误的无效证书配置删除,再重新操作。 - 手动配置Nginx的ACME挑战路径规则
certbot的nginx插件自动注入的配置经常会被站点里已有的rewrite、跳转、路径匹配规则覆盖,导致请求被拦截返回404,直接手动写固定规则绕开这个问题:- 找到你站点对应的Nginx配置文件,通常存放在
/etc/nginx/conf.d/或者/etc/nginx/sites-available/目录下 - 在监听80端口的
server块中,最靠前的位置加入以下配置:
location ^~ /.well-known/acme-challenge/ { default_type "text/plain"; root /var/www/letsencrypt; }- 执行以下命令创建对应目录、分配权限:
sudo mkdir -p /var/www/letsencrypt/.well-known/acme-challenge sudo chown -R www-data:www-data /var/www/letsencrypt- 执行
sudo nginx -t确认配置语法无错,再执行sudo systemctl reload nginx重载配置
- 找到你站点对应的Nginx配置文件,通常存放在
- 检查AWS侧的流量拦截规则
EC2环境不要只检查服务器内部的防火墙,必须核对两个云资源配置:- 实例绑定的安全组入站规则,确认80端口的源地址配置为
0.0.0.0/0,不要限制为特定IP段——Let's Encrypt的验证节点IP是全球动态分配的,源段限制会直接拦截验证请求 - 如果实例前挂载了CloudFront、ALB、WAF等流量入口服务,确认80端口的
/.well-known/acme-challenge/路径请求被直接转发到EC2实例,没有被WAF规则拦截,也没有配置强制HTTPS跳转。注意:http-01验证仅走80端口的HTTP请求,强制跳转会直接导致验证失败
- 实例绑定的安全组入站规则,确认80端口的源地址配置为
- 检查Nginx的全局跳转规则优先级
如果你的80端口配置了全局HTTP转HTTPS规则(比如return 301 https://$host$request_uri;),必须保证刚才加的acme-challenge路径匹配规则在跳转规则之前,否则验证请求会被直接跳转到HTTPS,无法被正确响应。 - 本地模拟验证
配置完成后,在/var/www/letsencrypt/.well-known/acme-challenge/目录下新建一个测试文件test.txt,写入任意内容,通过浏览器或者curl访问http://你的域名/.well-known/acme-challenge/test.txt,如果能正常拿到文件内容,说明路径配置生效,此时再执行sudo certbot renew --dry-run即可通过测试。 - 兜底排查方案
如果上述步骤操作完还是失败,直接绕开Nginx插件,用standalone模式验证:
如果standalone模式能验证通过,说明问题100%出在Nginx配置上,回去逐一排查站点配置里的路径匹配、rewrite、访问控制规则即可。# 先停Nginx释放80端口 sudo systemctl stop nginx # 执行续期测试 sudo certbot renew --dry-run # 测试通过后执行正式续期 sudo certbot renew # 续期完成后启动Nginx sudo systemctl start nginx
内容的提问来源于stack exchange,提问作者Zain Khan
相关产品推荐
相关产品推荐

