服务器防火墙开启后,若要使用 Let's Encrypt HTTP-01 方式续签证书,必须放行入站 TCP 80 端口。若使用 DNS-01 验证方式,则无需开放任何入站端口,但需配置 DNS API 权限。
先说结论:默认情况下需开放 TCP 80 端口供验证请求通过,除非改用 DNS 验证模式。
- 先确认:检查当前使用的证书验证方式是 HTTP-01 还是 DNS-01。
- 先处理:在操作系统防火墙及云厂商安全组中同时放行 80 端口。
- 再验证:执行 certbot renew `--dry-run` 确认续签流程无障碍。
命令速用版
根据常见防火墙工具,直接执行以下命令放行 80 端口:
UFW (Ubuntu/Debian):
sudo ufw allow 80/tcp sudo ufw reload
Firewalld (CentOS/RHEL):
sudo firewall-cmd `--permanent` `--add-port`=80/tcp sudo firewall-cmd `--reload`
iptables:
sudo iptables -I INPUT -p tcp `--dport` 80 -j ACCEPT
若使用云服务器,还需在控制台安全组规则中添加入站允许 TCP 80。
为什么会这样
Let's Encrypt 签发证书依赖 ACME 协议验证域名控制权,HTTP-01 挑战要求认证服务器能公开访问域名的 80 端口特定路径。
认证机构会向 http://yourdomain/.well-known/acme-challenge/ 发起请求,若防火墙拦截该入站流量,验证将失败导致续签中断。DNS-01 挑战通过修改 DNS TXT 记录验证,不依赖服务器入站端口,但需要 DNS 服务商 API 支持。
分步处理
步骤 1:确认防火墙状态
使用 sudo ufw status 或 sudo firewall-cmd `--state` 查看防火墙是否运行。若云服务商安全组独立于系统防火墙,需登录云平台控制台检查。
步骤 2:添加放行规则
根据上述命令速用版执行对应命令。注意规则需作用于 INPUT 链或入站方向。若服务器启用 IPv6,确保同时放行 IPv6 的 80 端口。
步骤 3:检查 Web 服务监听
验证本地 Web 服务器(Nginx/Apache)是否监听 80 端口。执行 sudo netstat -tlnp | grep :80 或 sudo ss -tlnp | grep :80。若未监听,Certbot standalone 模式可临时占用端口,但需停止现有 Web 服务。
步骤 4:执行续签测试
运行 sudo certbot renew `--dry-run`。该命令模拟续签流程,不会改变现有证书有效期,但会完整走一遍验证逻辑。
怎么验证是否生效
外部连通性测试:
在本地电脑或非服务器网络环境下,执行 curl -I http://yourdomain/.well-known/acme-challenge/test。若返回 404 而非连接超时或拒绝连接,说明端口已通且 Web 服务正常。
续签日志检查:
查看 Certbot 日志 /var/log/letsencrypt/letsencrypt.log。若看到 SUCCESS 或 Congratulations 字样,表示验证通过。若出现 Connection refused 或 Timeout,则防火墙仍未放行。
常见坑
云安全组优先级更高: 操作系统防火墙放行后,若云平台安全组未开放 80 端口,外部请求仍会被拦截。两者需同时配置。
Web 服务器配置冲突: 若 Nginx/Apache 配置了强制跳转 HTTPS,需确保 HTTP-01 验证路径不被跳转。Certbot 通常会自动处理,但手动配置 rewrite 规则时需注意排除 /.well-known/acme-challenge/。
IPv6 遗漏: 双栈网络环境下,若仅放行 IPv4 的 80 端口,认证机构可能通过 IPv6 发起验证导致失败。建议同时放行 IPv6 入站 80 端口。
常见问题
必须开放 443 端口才能续签吗?
不需要。HTTP-01 验证仅依赖 80 端口,443 端口用于 HTTPS 服务运行,不参与验证过程。
续签完成后可以关闭 80 端口吗?
不建议。证书有效期通常为 90 天,自动续签脚本会在到期前尝试连接 80 端口,关闭会导致后续续签失败。
无法开放 80 端口有什么替代方案?
使用 DNS-01 验证方式。需配置 Certbot 插件对接 DNS 服务商 API,通过添加 TXT 记录完成验证,无需开放服务器入站端口。
参考来源
- Let's Encrypt, "Challenge Types", letsencrypt.org/docs/challenge-types/
- Let's Encrypt, "FAQ", letsencrypt.org/docs/faq/
- Certbot, "Instructions", certbot.eff.org/instructions