服务器防火墙阻挡 80 端口如何影响 Let's Encrypt HTTP 验证续签?

文章导读
如果服务器防火墙阻挡了 80 端口,Let's Encrypt 的 HTTP-01 验证请求无法到达你的服务器,证书续签会直接失败。最稳妥的处理是临时放行 80 端口或切换到 DNS 验证方式。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
A A

如果服务器防火墙阻挡了 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 端口入站。

服务器防火墙阻挡 80 端口如何影响 Let's Encrypt HTTP 验证续签?

3. 执行续签
端口开放后,立即运行续签命令。如果是自动续签任务,可以手动触发一次以确保配置正确。

4. 后续策略
如果你的业务不需要 80 端口(例如只使用 443),可以在续签完成后关闭 80 端口,但下次续签前需再次开放。更推荐的做法是保持 80 端口开放并将流量重定向到 443,这样无需反复调整防火墙。

怎么验证是否生效

使用 certbot 的干跑模式是最准确的验证方法,它会模拟续签流程但不改变现有证书。

sudo certbot renew `--dry-run`

观察输出日志,如果看到 Congratulations 或 Successfully renewed 字样,说明网络验证已通过。如果仍然报错,查看错误信息中是否包含 Fetching 或 Connection 相关的提示。

服务器防火墙阻挡 80 端口如何影响 Let's Encrypt HTTP 验证续签?

另外,可以在浏览器直接访问 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 文件不要有错误绑定,否则本地测试通过但外网验证依然失败。