如果服务器防火墙阻挡了 80 端口,Let's Encrypt 的 HTTP-01 验证请求无法到达你的服务器,证书续签会直接失败。最稳妥的处理是临时放行 80 端口或切换到 DNS 验证方式。
先说结论:80 端口不通是 HTTP 验证失败的常见原因,必须确保验证期间公网可访问。
- 先确认:使用外部工具测试 80 端口连通性
- 先处理:在防火墙或安全组放行 80 端口,或配置 DNS 验证
- 再验证:执行续签 dry-run 确认流程通畅
命令速用版
# 从外部测试 80 端口是否通(在另一台机器执行)
curl -I http://你的域名/
# Ubuntu/Debian 临时放行 80 端口
sudo ufw allow 80/tcp
# CentOS/RHEL 临时放行 80 端口
sudo firewall-cmd `--zone`=public `--add-port`=80/tcp `--permanent`
sudo firewall-cmd `--reload`
# 测试续签(不实际更新证书)
sudo certbot renew `--dry-run`为什么会这样
Let's Encrypt 默认使用 HTTP-01 挑战方式来验证你对域名的控制权。认证机构(CA)的服务器会尝试从公网访问你服务器的 80 端口,请求特定路径下的验证文件(通常在 /.well-known/acme-challenge/ 下)。
如果防火墙、安全组或中间网络设备阻挡了 80 端口的入站流量,CA 服务器无法获取验证文件,验证就会判定为失败,续签流程随之终止。这不是证书软件的问题,而是网络可达性问题。
分步处理
1. 确认端口状态
不要只在服务器内部检查,必须从外网测试。使用另一台服务器或本地终端执行 curl 命令。如果显示 Connection refused 或 Connection timed out,说明端口确实不通。
2. 调整防火墙规则
检查两层防火墙:云服务商的安全组(如 AWS Security Group、阿里云安全组)和操作系统内部的防火墙(如 ufw、iptables、firewalld)。确保两者都允许 TCP 80 端口入站。
3. 执行续签
端口开放后,立即运行续签命令。如果是自动续签任务,可以手动触发一次以确保配置正确。
4. 后续策略
如果你的业务不需要 80 端口(例如只使用 443),可以在续签完成后关闭 80 端口,但下次续签前需再次开放。更推荐的做法是保持 80 端口开放并将流量重定向到 443,这样无需反复调整防火墙。
怎么验证是否生效
使用 certbot 的干跑模式是最准确的验证方法,它会模拟续签流程但不改变现有证书。
sudo certbot renew `--dry-run`观察输出日志,如果看到 Congratulations 或 Successfully renewed 字样,说明网络验证已通过。如果仍然报错,查看错误信息中是否包含 Fetching 或 Connection 相关的提示。
另外,可以在浏览器直接访问 http://你的域名/.well-known/acme-challenge/ 测试路径是否可达(需要有正在进行的验证文件,通常用于调试)。
常见坑
1. 云安全组遗漏
很多用户只配置了系统防火墙,忽略了云控制台的安全组规则。安全组优先级通常更高,必须两边都检查。
2. CDN 或反向代理干扰
如果域名接了 CDN,确保 CDN 回源配置正确,且没有阻挡 ACME 挑战路径。部分 CDN 需要特殊配置才能透传 .well-known 请求。
3. IPv6 问题
如果服务器开启了 IPv6 但防火墙只配置了 IPv4 规则,CA 服务器可能尝试通过 IPv6 连接而失败。建议暂时关闭 IPv6 或确保 IPv6 防火墙规则同步放行。
4. 本地 hosts 绑定
确保域名解析正确指向当前服务器公网 IP,本地 hosts 文件不要有错误绑定,否则本地测试通过但外网验证依然失败。