对于个人站长来说,Let’s Encrypt 提供了便捷免费的 HTTPS 证书。然而,证书在续期时如果报错,往往让人摸不着头脑。最常见的两大疑凶便是:域名没有正确解析到新 IP,或是服务器的 80 端口被防火墙或网络服务商阻挡。
本文将聚焦于 Let’s Encrypt 最常用的 HTTP-01 验证方式,提供一套诊断流程,帮你准确找出失败的原因。
步骤一:理解 HTTP-01 验证原理
Let’s Encrypt 机构(ACME 服务器)需要通过公网访问您的域名。如果您的域名是 example.com,ACME 服务器会尝试访问 http://example.com/.well-known/acme-challenge/TOKEN。如果服务器能响应这个挑战文件,则验证成功。
续期失败,意味着 ACME 服务器无法成功访问到这个特定的 URL。
步骤二:检查 DNS 解析是否正确
如果您的 VPS IP 地址发生了变化,但 DNS 记录未更新,ACME 服务器就会尝试连接到一个错误的 IP,导致验证失败。
1. 使用 dig 或在线工具检查 A 记录
登录到您的 VPS 或使用本地终端,检查您的域名是否指向正确的公网 IP。请注意,ACME 服务器是从全球不同地理位置进行连接的,所以最好使用公共 DNS 或多地点查询工具。
# 检查主域名 A 记录
dig +short example.com A
# 检查 www 子域名 A 记录 (如果使用了 www)
dig +short www.example.com A
诊断结果:
- 如果返回 IP 错误: 问题在于 DNS。请立即到域名服务商后台修改 A 记录。注意 DNS 缓存(TTL)可能需要几分钟到几小时才能全球生效。
- 如果返回 IP 正确: 解析没有问题,问题可能出在服务器端(防火墙或 Web 服务)。
步骤三:检查服务器的 IP 连通性与防火墙
即使 DNS 指向正确,如果您的服务器禁止了 80 端口的流量,ACME 服务器依然无法完成挑战。
1. 确认 80 端口是否开放
这是最常见的续期失败原因之一。检查本地防火墙(如 ufw 或 iptables)。
UFW 防火墙检查(Ubuntu/Debian 常用)
sudo ufw status verbose
# 如果 80 端口没有开放,请执行以下命令开放
sudo ufw allow 80/tcp
IPtables 防火墙检查(CentOS/RHEL 常用)
sudo iptables -L -n | grep 80
# 如果没有规则允许80端口,请手动添加或通过firewalld服务管理
注意: 如果您的 VPS 位于阿里云、腾讯云等公有云,请务必检查云服务商的安全组(Security Group)配置,确保入站规则中允许 TCP 80 端口的流量。
2. 确认 Web 服务是否在运行
负责响应 ACME 挑战的 Web 服务器(Nginx 或 Apache)必须正常运行并监听 80 端口。
# 检查 Web 服务状态 (以 Nginx 为例)
sudo systemctl status nginx
# 确认80端口被监听
sudo netstat -tuln | grep 80
如果 Web 服务器未运行或 80 端口没有监听,Let’s Encrypt 将无法放置和读取挑战文件。
3. 本地模拟 ACME 访问
当您运行 Certbot 尝试续期时,它会在特定目录下放置一个挑战文件。在续期失败后,您可以手动尝试通过本地服务器访问该路径,确认 Web 服务器是否配置正确。
例如,如果 Certbot 尝试访问 http://example.com/.well-known/acme-challenge/testfile,您可以在本地放置一个文件,并尝试通过 curl 访问:
# (假设您已在挑战目录创建了临时文件 'test.txt')
curl -I http://example.com/.well-known/acme-challenge/test.txt
如果 curl 返回 200 OK,说明 Web 服务器本身是正常响应的。如果返回连接超时或拒绝,那基本确定是防火墙或安全组问题。
总结与快速修复
| 续期失败现象 | 主要诊断方向 | 修复措施 |
|---|---|---|
| Certbot 日志显示 ‘No A record found’ 或 ‘Name not resolved’ | DNS 解析错误 | 更新域名 A 记录,等待 TTL 生效。 |
| Certbot 日志显示 ‘Connection refused’ 或 ‘Timeout’ | IP/防火墙阻塞 | 检查 VPS 本地防火墙和云服务商安全组,确保 TCP 80 端口对公网开放。 |
| Certbot 日志显示 ‘Error 404 Not Found’ | Web 服务配置错误 | 检查 Nginx/Apache 配置,确保 .well-known/acme-challenge 路径可以被正确处理,且服务在运行。 |
汤不热吧