私有网络 SSL 证书自动续期实战

演示私有网络入口的 nginx TLS 配置,说明 Certbot 4.0.0 起在证书剩余生命周期不足三分之一时进入续期,并给出 DNS-01、内部 ACME、Tailscale 与 SSH 转发的落地清单。

私有化部署中的 SSL 自动续期,可以沿着私网连通性、ACME 续期和 nginx 证书配置落地。公网域名可采用 DNS-01,内部签发可采用 ACME;关键是让管理端能到达签发端和 HTTPS 入口。下面按准备、验证方式、Certbot 定时续期、nginx 配置和排错顺序展开。

私有化部署前要准备什么

开始前,把域名、证书来源、TLS 入口、续期执行账户和证书文件对应起来。管理终端必须能访问签发端与 HTTPS 服务,否则即使续期成功,也无法在私网侧验收。

  • 证书来源:Let's Encrypt 配合 DNS-01,或由 step-ca 提供内部 ACME。
  • 私网路径:配置 Tailscale 子网路由,或使用 SSH 本地端口转发。
  • 续期条件:执行账户能够读取原有续期配置,并能写入实际采用的证书目录。
  • nginx 文件:确认 ssl_certificate 与 ssl_certificate_key 指向现有证书,续期过程中不要随意更换路径。

选择 DNS-01 或内部 ACME

若使用 Let's Encrypt,根据验证类型说明,DNS-01 通过在 _acme-challenge.YOUR_DOMAIN 下写入指定 TXT 值来证明域名控制权。通配符证书必须使用 DNS-01;自动更新有意义的前提是 DNS 服务商提供 API。_acme-challenge 还可以通过 CNAME 或 NS 委派给其他 DNS 区域或验证服务器。HTTP-01 只能在 port 80 上完成;如果验证端无法通过该端口访问主机,应改用 DNS-01。

内部签发可以采用 step-ca。其 ACME 基础文档说明,ACME 既可用于公共 Web PKI CA,也可用于私有内部 CA,标准 ACME 客户端能够取得 X.509 证书。具体初始化参数和 ACME 服务地址取决于你的部署,应从当前 step-ca 文档填写,不要照搬其他环境的地址。

用 Tailscale 或 SSH 进入私网

对于不能运行 Tailscale 客户端的设备,子网路由文档说明可以通过 subnet router 把它们接入 tailnet。Linux 路由器需要先启用 IP forwarding,再把逗号分隔的路由列表传给 tailscale set --advertise-routes。Linux 客户端接受已公布的路由:

sudo tailscale set --accept-routes

临时管理或只需要转发端口时,可以使用 SSH。OpenSSH 手册说明,ssh -L 会把本地端口或 socket 转发到远端能够访问的主机和端口,而 -N 不执行远程命令,适合纯端口转发:

ssh -N -L YOUR_LOCAL_PORT:YOUR_PRIVATE_HOST:YOUR_PRIVATE_PORT YOUR_USER@YOUR_TUNNEL_HOST

把占位值替换为实际地址后,这条命令应与你的私网拓扑相符。

配置 nginx 的 HTTPS 入口

nginx 的 HTTPS 服务器配置要求在 listen 中使用 ssl,并配置 ssl_certificate 和 ssl_certificate_key:

server {
    listen 443 ssl;
    server_name YOUR_PRIVATE_HOST;

    ssl_certificate YOUR_CERTIFICATE_FILE;
    ssl_certificate_key YOUR_PRIVATE_KEY_FILE;
}

私钥文件应限制访问,但必须能够被 nginx 主进程读取;官方文档还说明 nginx 默认使用 TLSv1.2 和 TLSv1.3,因此通常不需要显式配置 ssl_protocols。私钥权限调整后,应确认 nginx 主进程仍能正常读取文件。

配置并验收自动续期

根据 Certbot 用户指南,从 Certbot 4.0.0 起,证书剩余生命周期不足 1/3 时会被视为可以续期。certbot renew 会处理以前取得且已经进入续期时点的证书,适合无人值守运行,也可以由 cron 每日或每周调用。安排正式任务前,先备份续期配置并测试:

certbot renew --dry-run

确认 dry-run 能完成续期流程后,让现有 cron 作业执行正式命令:

certbot renew

certbot renew 不是初次签发命令。首次证书仍需按所选 DNS-01 或内部 ACME 服务的当前文档取得,并保存对应的续期配置。实际续期完成后,从管理终端沿私网路径检查 HTTPS 入口呈现的证书;nginx 的重载命令取决于安装和进程管理方式,应按当前部署文档执行,不要写死其他环境的命令。

常见出错点

  • 把 certbot renew 当成首次签发。 Certbot 用户指南只让它处理以前取得的证书;standalone 插件还需要绑定 port 80,现有 Web 服务可能因此需要停止。
  • DNS 记录存在但验证失败。 按 Let's Encrypt 的验证规则检查 TXT 是否位于 _acme-challenge.YOUR_DOMAIN,DNS 服务商是否提供自动更新 API,以及通配符是否使用了 DNS-01。
  • 管理端连不上私网服务。 根据 Tailscale 子网路由要求,依次检查 IP forwarding、--advertise-routes 和客户端的 --accept-routes。

本文步骤按正文所链接的官方文档整理,未运行或测量任何环境;使用前应按当前版本核对。

资料来源