服务器Let's Encrypt证书申请失败:curl报404但浏览器可访问
嘿,我碰到过类似的情况——服务器本地DNS解析跑偏,导致ACME挑战失败,浏览器能访问但服务器curl不行,核心就是本地解析指向了错误的经销商服务器IP。给你几个靠谱的解决步骤,按优先级来:
解决方案1:强制本地Hosts解析(最快速有效)
服务器的/etc/hosts文件优先级高于任何外部DNS服务器,直接在这里指定域名的正确IP就能绕开错误的DNS解析:
- 编辑hosts文件:
vi /etc/hosts - 在文件末尾添加一行(把
[你的服务器IP]换成实际的服务器公网IP,所有涉事域名用空格分隔):123.45.67.89 example.com domain.nl - 保存退出(vi中按
Esc,输入:wq回车)。 - 测试解析是否生效:
现在应该返回你指定的服务器IP了。ping example.com nslookup example.com - 再次验证curl访问挑战文件:
正常情况下会返回/usr/bin/curl -I -L -k -X GET http://example.com/.well-known/acme-challenge/test.txtHTTP/1.1 200 OK。
解决方案2:清空本地DNS缓存
如果服务器运行了DNS缓存服务(比如nscd或dnsmasq),旧的错误解析记录可能还在缓存里,需要清空:
- 若用
nscd缓存:sudo systemctl restart nscd - 若用
dnsmasq缓存:sudo systemctl restart dnsmasq - 若用BIND服务器:
sudo rndc flush
解决方案3:临时切换DNS服务器(可选)
如果不想修改hosts,可以临时把服务器的DNS换成其他公共DNS(比如Cloudflare的1.1.1.1),看是否能获取正确解析:
- 编辑
/etc/resolv.conf:vi /etc/resolv.conf - 替换原有的
nameserver 8.8.8.8为:nameserver 1.1.1.1 nameserver 1.0.0.1 - 注意:部分CentOS系统会自动覆盖
resolv.conf,如果出现这种情况,需要修改网卡配置文件(/etc/sysconfig/network-scripts/ifcfg-*)里的DNS参数,然后重启网络服务:sudo systemctl restart network
后续验证
完成上述操作后,重新尝试Let's Encrypt证书申请:
- 若用DirectAdmin面板:直接在面板的SSL管理模块重新申请即可。
- 若用certbot命令:
替换certbot certonly --webroot -w /path/to/your/webroot -d example.com -d domain.nl/path/to/your/webroot为涉事域名对应的网站根目录。
内容的提问来源于stack exchange,提问作者Salihan Pamuk
相关产品推荐
相关产品推荐

