在服务器间同步 TLS 证书
在一堆服务器上面都部署同一个(泛)域名、自动续期的 TLS 证书的最简单方法,自然是在每台服务器上都装一个 ACME 客户端。不过,这样也会收获一堆证书透明度记录。免费的证书短命,每隔几十天手工更新每一台服务器也太累人。
为什么不用反向代理?那当然是需要部署……(笑)
准备
- 1 台「管理服务器」(Management Server)
- 安装 ACME 客户端、rsync
- 若干台「目标服务器」(Target Server)
- 安装 rsync 和需要使用证书的服务
管理服务器:签发证书
使用你喜欢的 ACME 客户端自行解决。
证书存储路径上,我选择了和某软件接近的 /usr/local/etc/acmesh
。
由于一些蛋疼的权限问题,我选择授予 crt 和 key 文件 644
权限。否则待会儿启动服务的时候,会抱怨读取不了 600
权限的 key。
管理服务器:生成 SSH Key
1 | # 生成 ed25519 SSH Key |
目标服务器:配置用户
我创建了一个新的用户 cert-updater
用于执行这项任务。根据实际情况和权限的精细管理,你可能需要进行创建用户组等额外操作。
以下命令可能需要以 root 权限执行,请注意。
1 | # 创建用户 |
配置好用户之后,将此用户的登录信息加入管理服务器的 .ssh/config
。
1 | Host your-target-server-alpha |
我也考虑过是否可以直接使用 Tailscale SSH,不过想了想还是直连吧。(
管理服务器:同步
1 |
|
将这段脚本保存在你喜欢的地方。
鉴于我用的是 acme.sh,我将脚本设置为了 --reloadcmd
,这样在证书更新时就会自动执行,更新远端的证书并重启 / 重载相关的服务。
测试
- 检查 rsync 是否有权限问题、证书文件是否正常同步
- 示例命令使用了 archive mode,如果这不符合你的需求,你可能需要调整
- 检查重载脚本是否能正常执行
- 检查重启后的服务是否能正常运行
- 比如,是否会因为神秘的权限问题导致失败
(权限管控方面)不太好的实践,主要也是在这一块了。
在服务器间同步 TLS 证书