总结:Certbot 停止生成证书,显示“检测到重定向循环”错误,但实际上并没有重定向循环。
以下问题出现在 2023-11-30 左右。我专注于单个服务器的单个网站,但同样的问题发生在我尝试的数据中心内的每个服务器和每个网站上。(在我的个人 OVH VPS 上不会发生此问题。)
因此,我有一台服务器,它托管了数千个 Wordpress 网站,每个网站都有自己的域名。我定期添加新网站。要生成新证书,我使用以下命令行:
/snap/bin/certbot certonly --register-unsafely-without-email --config-dir certbot/conf --work-dir certbot/work --logs-dir certbot/logs --webroot --webroot-path /home/wordpress/ -d testcert.numerian.fr,www.testcert.numerian.fr
多年来,这种方法运行良好,但从上周开始,它显示了这个错误:
Certbot failed to authenticate some domains (authenticator: webroot). The Certificate Authority reported these problems:
Domain: testcert.numerian.fr
Type: connection
Detail: 46.18.231.82: Fetching /.well-known/acme-challenge/s2OgquUDSF4hzNPUse66QmM-KOTPApHXrLcIJqFuQTA: Redirect loop detected
Domain: www.testcert.numerian.fr
Type: connection
Detail: 46.18.231.82: Fetching /.well-known/acme-challenge/14WgGIBhYGCcUx6BYro1cI4y6UfZ9Z_20uYgFtJQ6-M: Redirect loop detected
两点:
nginx 服务器的配置几个月来都没有改变,所以没有理由出现重定向循环。此外,如果我在这个目录中手动重新创建文件,我可以用 curl 正常访问它,根本不需要重定向:
curl -i http://www.testcert.numerian.fr/.well-known/acme-challenge/14WgGIBhYGCcUx6BYro1cI4y6UfZ9Z_20uYgFtJQ6-M
如果我查看 certbot 日志,我会看到一些奇怪的事情:似乎 letsencrypt 试图访问 URL
- http://www.testcert.numerian.fr/.well-known/acme-challenge/14WgGIBhYGCcUx6BYro1cI4y6UfZ9Z_20uYgFtJQ6-M,正如预期的那样,而且
- http://www.testcert.numerian.fr/phdQX/.well-known/acme-challenge/14WgGIBhYGCcUx6BYro1cI4y6UfZ9Z_20uYgFtJQ6-M,在“well-known”前添加前缀“phdQX”
以下是日志的相关部分:
{
"identifier": {
"type": "dns",
"value": "www.testcert.numerian.fr"
},
"status": "invalid",
"expires": "2023-12-12T08:04:51Z",
"challenges": [
{
"type": "http-01",
"status": "invalid",
"error": {
"type": "urn:ietf:params:acme:error:connection",
"detail": "46.18.231.82: Fetching /.well-known/acme-challenge/14WgGIBhYGCcUx6BYro1cI4y6UfZ9Z_20uYgFtJQ6-M: Redirect loop detected",
"status": 400
},
"url": "https://acme-v02.api.letsencrypt.org/acme/chall-v3/290578127326/TNJCjw",
"token": "14WgGIBhYGCcUx6BYro1cI4y6UfZ9Z_20uYgFtJQ6-M",
"validationRecord": [
{
"url": "http://www.testcert.numerian.fr/.well-known/acme-challenge/14WgGIBhYGCcUx6BYro1cI4y6UfZ9Z_20uYgFtJQ6-M",
"hostname": "www.testcert.numerian.fr",
"port": "80",
"addressesResolved": [
"46.18.231.82"
],
"addressUsed": "46.18.231.82"
},
{
"url": "http://www.testcert.numerian.fr/phdQX/.well-known/acme-challenge/14WgGIBhYGCcUx6BYro1cI4y6UfZ9Z_20uYgFtJQ6-M",
"hostname": "www.testcert.numerian.fr",
"port": "80",
"addressesResolved": [
"46.18.231.82"
],
"addressUsed": "46.18.231.82"
}
],
"validated": "2023-12-05T08:04:51Z"
}
]
}
这肯定是新的,因为这个带前缀的 URL 以前无法工作。但是,即使在配置 nginx 以使这个带前缀的 URL 指向正确的文件后,证书生成仍然会失败。这现在可以工作了,但上周会出现 404 错误:
curl -i http://www.testcert.numerian.fr/phdQX/.well-known/acme-challenge/14WgGIBhYGCcUx6BYro1cI4y6UfZ9Z_20uYgFtJQ6-M
这是当前相关的 nginx 配置(将 HTTP 重定向到 HTTPS,acme-challenge 除外,并删除 well-known/acme-challenge 之前的前缀(如果存在)。 (重写是昨天才添加的。)
server {
server_name _;
listen 80 default_server;
root /home/wordpress;
location / {
return 301 https://$host:443$request_uri;
}
location ~ well-known/acme-challenge {
rewrite ^(/\w+)(/\.well-known/acme-challenge/.*)$ $2 last;
}
}
更多 nginx 配置在这里:https://gist.github.com/bveuillez/49727a30cc4534ce35b9c0d79ea1d779
我尝试了所有能想到的方法来修复这个问题,主要是从头开始重新安装 certbot,尝试各种 certbot 选项,并调整 nginx 配置,但都无济于事。如果能提供任何有关问题根源的提示,我将不胜感激。
编辑:进一步的失败尝试
我尝试添加选项--debug-challenges -v
/snap/bin/certbot certonly --register-unsafely-without-email --config-dir certbot/conf --work-dir certbot/work --logs-dir certbot/logs --webroot --webroot-path /home/wordpress/ -d testcert.numerian.fr,www.testcert.numerian.fr --dry-run --debug-challenges -v
它显示了两个 URL 的预期值,对这些 URL 执行 curl 操作后,结果是正确的,无需任何重定向。但挑战失败,提示“检测到重定向循环”。
letsdebug.net 还告诉我它看到 302 重定向,但我在 nginx 日志中没有找到任何痕迹。
我尝试用 --nginx 替换 --webroot
/snap/bin/certbot certonly --register-unsafely-without-email --config-dir certbot/conf --work-dir certbot/work --logs-dir certbot/logs --nginx -d testcert.numerian.fr,www.testcert.numerian.fr --dry-run --debug-challenges -v
我可以看到改变的 nginx 配置,我可以卷曲两个 URL 并获取正确的值,但仍然收到错误“检测到重定向循环”。
我尝试配置这个域名,使其具有与整个 wordpress 分开的 webroot,以防它以某种方式来自那里:
server {
server_name testcert.numerian.fr;
listen 80;
root /var/www/html;
}
然后使用与之前相同的 certbot 命令,使用 --debug-challenges,与之前一样,我在 curl URL 时获得了正确的值,但随后收到错误“检测到重定向循环”
编辑 :
我最终创建了一个新的虚拟机,只使用 nginx 和 certbot 进行比较。certbot 不仅在虚拟机上运行良好,而且在所有其他服务器上也开始正常工作。我仍然无法弄清楚是什么原因导致的,然后修复了这一切,但至少问题已经解决了。
答案1
你确实有一个重定向循环:
$ curl -I http://testcert.numerian.fr/.well-known/acme-challenge/s2OgquUDSF4hzNPUse66QmM-KOTPApHXrLcIJqFuQTA
HTTP/1.1 302 Found
Connection: close
Pragma: no-cache
cache-control: no-cache
Location: /ZQOLV/.well-known/acme-challenge/s2OgquUDSF4hzNPUse66QmM-KOTPApHXrLcIJqFuQTA
$ curl -I http://testcert.numerian.fr/ZQOLV/.well-known/acme-challenge/s2OgquUDSF4hzNPUse66QmM-KOTPApHXrLcIJqFuQTA
HTTP/1.1 302 Found
Connection: close
Pragma: no-cache
cache-control: no-cache
Location: /RkUQX/ZQOLV/.well-known/acme-challenge/s2OgquUDSF4hzNPUse66QmM-KOTPApHXrLcIJqFuQTA
$ curl -I http://testcert.numerian.fr//RkUQX/ZQOLV/.well-known/acme-challenge/s2OgquUDSF4hzNPUse66QmM-KOTPApHXrLcIJqFuQTA
HTTP/1.1 302 Found
Connection: close
Pragma: no-cache
cache-control: no-cache
Location: /PmcKW//RkUQX/ZQOLV/.well-known/acme-challenge/s2OgquUDSF4hzNPUse66QmM-KOTPApHXrLcIJqFuQTA
您的网络服务器正在进行这些重定向,出于某种原因添加了五个随机数字。从您发布的配置中,我看不出是什么在做这件事。您可以使用以下命令转储整个配置nginx -T