Digital Ocean上Let's Encrypt证书自动续期失败求助
解决Let's Encrypt证书自动续期时acme-challenge路径响应异常的问题
核心问题分析
手动执行certbot --nginx能成功续期,但自动续期失败,本质是自动续期时的HTTP-01验证请求被Nginx的现有规则拦截,返回了网页内容而非验证字符串。手动执行时certbot会临时调整Nginx配置完成验证,但自动续期依赖预配置的规则,所以需要确保Nginx规则优先处理acme-challenge请求。
具体解决步骤
1. 调整Nginx配置,优先匹配acme-challenge路径
在Nginx的HTTP(80端口)server块最顶部添加以下规则,确保它比rewrite、反向代理等规则先生效:
server { listen 80; server_name example.com www.example.com; # 优先处理acme验证请求 location /.well-known/acme-challenge/ { root /var/www/html; # 路径需与certbot自动续期配置的webroot一致 default_type text/plain; try_files $uri =404; } # 其余请求重定向到HTTPS location / { return 301 https://$host$request_uri; } }
修改后执行sudo nginx -s reload重载配置,再用curl http://example.com/.well-known/acme-challenge/test测试,若返回404而非网页内容,说明规则生效。
2. 检查certbot自动续期配置
打开/etc/letsencrypt/renewal/example.com.conf,确认以下字段:
- 若
authenticator = nginx:确保Nginx主配置中没有冲突的location规则覆盖acme-challenge路径; - 若
authenticator = webroot:确认webroot_path的值(如/var/www/html)与Nginx配置中的root完全一致,且该目录存在、权限为www-data:www-data。
3. 测试自动续期流程
执行sudo certbot renew --dry-run模拟自动续期,根据报错信息定位问题:
- 若仍提示“无效响应”,检查acme-challenge目录的权限:
sudo chown -R www-data:www-data /var/www/html/.well-known sudo chmod -R 755 /var/www/html/.well-known - 若提示“无法写入webroot”,确认certbot进程有权限访问该目录。
4. 排查Nginx全局规则冲突
检查Nginx的全局配置(如/etc/nginx/nginx.conf或/etc/nginx/conf.d/下的通用规则),确保没有全局rewrite或location规则拦截/.well-known/acme-challenge/路径。
内容的提问来源于stack exchange,提问作者EarlyCoder
相关产品推荐
相关产品推荐

