负载均衡集群环境下如何统一续签 Let's Encrypt 证书?

文章导读
在负载均衡集群环境下,最推荐通过 DNS-01 挑战方式统一续签 Let's Encrypt 证书,或者在单一节点续签后同步至所有节点。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在负载均衡集群环境下,最推荐通过 DNS-01 挑战方式统一续签 Let's Encrypt 证书,或者在单一节点续签后同步至所有节点。

此方案适用于多节点 Nginx 或 HAProxy 架构,风险边界在于 DNS API 权限管理及证书同步期间的服务中断。

先说结论:集群环境续签证书应优先选择 DNS-01 挑战或集中式管理,避免 HTTP-01 挑战因节点文件不一致导致验证失败。

  • 适合:多服务器负载均衡架构、无法保证会话粘性(Sticky Session)的场景
  • 先准备:DNS 服务商 API 密钥或共享存储挂载权限
  • 验收:所有节点证书有效期一致且服务无中断

命令速用版

使用 acme.sh 配合 DNS API 可直接在任意节点完成续签,无需 Web 服务器参与验证。

export LE_API="https://acme-v02.api.letsencrypt.org/directory"
export DNS_API_KEY="your_dns_api_key"
acme.sh `--issue` `--dns` dns_provider -d example.com -d www.example.com
acme.sh `--install-cert` -d example.com \
`--cert-file` /etc/ssl/certs/example.com.crt \
`--key-file` /etc/ssl/private/example.com.key \
`--reloadcmd` "systemctl reload nginx"

若使用集中式续签,需在主节点执行续签后,通过 rsync 或配置管理工具将证书分发至集群。

为什么会这样

HTTP-01 挑战要求验证文件必须存在于请求到达的具体节点上,而负载均衡会将请求随机分发。

Let's Encrypt 的 HTTP-01 验证机制需要访问 `http://domain/.well-known/acme-challenge/` 下的特定文件。在集群环境中,如果验证请求被负载均衡器分发到未存放挑战文件的节点,验证将失败。DNS-01 挑战通过修改 DNS TXT 记录验证域名所有权,不依赖具体 Web 服务器节点,因此更适合集群架构。

分步处理

第一步:选择验证方式并准备凭证。

适用场景:所有集群节点均可访问外网或具备 DNS API 调用权限。操作动作:在 DNS 服务商控制台生成 API Key。风险边界:API Key 泄露可能导致 DNS 记录被篡改,需限制 Key 权限仅允许修改 TXT 记录。

负载均衡集群环境下如何统一续签 Let's Encrypt 证书?

第二步:执行证书续签命令。

适用场景:选定的一台管理节点。操作动作:运行 certbot 或 acme.sh 的 DNS 挑战命令。验证结果:命令输出显示 Certificate success。风险边界:DNS 传播延迟可能导致验证超时,公开资料中没有看到可靠的量化数据,通常建议预留几分钟等待。

第三步:同步证书文件至所有节点。

适用场景:多节点 Web 服务器。操作动作:使用 rsync 或 Ansible 将 crt 和 key 文件分发至集群各节点相同路径。验证结果:各节点文件哈希值一致。风险边界:同步过程中旧证书可能被覆盖,需确保原子操作或先备份。

第四步:重载 Web 服务。

适用场景:所有节点。操作动作:执行 `nginx -s reload` 或 `systemctl reload nginx`。验证结果:进程不中断,新连接使用新证书。风险边界:配置错误可能导致服务启动失败,需先执行 `nginx -t` 检查配置。

怎么验证是否生效

使用 OpenSSL 命令检查各节点证书有效期是否更新。

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates

查看日志确认重载成功,Nginx 日志通常位于 `/var/log/nginx/error.log`,搜索 reload 相关记录。浏览器访问 HTTPS 站点,点击锁图标查看证书有效期,确认所有节点返回的证书一致。

负载均衡集群环境下如何统一续签 Let's Encrypt 证书?

常见坑

Let's Encrypt 存在速率限制,每周每个注册域名最多颁发 50 张证书,频繁重试可能触发限制。

证书文件权限错误会导致 Web 服务无法启动,私钥文件权限应设置为 600,属主为 root 或运行 Web 服务的用户。集群时间不同步可能导致证书验证逻辑异常,确保所有节点使用 NTP 同步时间。重载服务时若配置有误,可能导致旧进程退出新进程启动失败,造成服务中断,务必先测试配置。

常见问题

HTTP-01 挑战在集群中完全不可用吗?

不是完全不可用,但需要配合共享存储或会话粘性。

若使用 NFS 共享 `.well-known` 目录,或配置负载均衡器将挑战请求固定转发至单一节点,HTTP-01 挑战也可行,但配置复杂度高于 DNS-01。

证书同步是否需要停机?

不需要停机,平滑重载即可生效。

Nginx 等主流 Web 服务器支持平滑重载,新连接使用新证书,旧连接保持至关闭,但需确保所有节点同步完成后再依次重载,避免部分节点证书过期。

自动化续签如何部署?

建议在独立管理节点设置 Cron 任务,完成后触发远程重载。

避免在每台 Web 服务器上独立运行续签任务,以免触发速率限制或造成证书版本不一致,集中管理更可靠。

参考来源

  • Let's Encrypt Official Docs, Validation Types, https://letsencrypt.org/docs/challenge-types/
  • acme.sh Wiki, DNS API, https://github.com/acmesh-official/acme.sh/wiki/dnsapi
  • Nginx Documentation, Controlling Nginx, https://nginx.org/en/docs/control.html