mongod 需要一个由证书和私钥组合而成的 certificateKeyFile。
certbot 管理有效期不能超过 3 个月的 tls 证书的季度续订。 certbot 续订成功运行的结果是创建新的证书文件,可以通过 上的某些符号链接(它也管理)访问这些证书文件/etc/letsencrypt/live/$(hostname -f)
。
有没有办法创建一个包含以下内容输出的符号链接、命名管道或循环设备:
cat /etc/letsencrypt/live/$(hostname -f)/{fullchain,privkey}.pem
我不想创建一个包含连接结果的实际文件,因为每次 certbot 延长证书有效期时都必须更新该文件,并且 certbot 进行更新和某些自动化创建包含 mongod 期望格式的证书的新连接之间的任何时间段内,mongod 都会中断。
我想到的一个解决方案是使用 systemd 依赖链在 certbot 更新证书后重新启动 mongod,并在 mongod.service 单元上使用 ExecStartPre 创建连接的 certificateKeyFile。但如果有办法创建所需文件连接的某种动态表示,我就不需要任何这些。
有任何想法吗?
答案1
如果在重新加载使用证书文件的任何守护进程之前证书文件已到位,则应该可以工作。至少在大多数 POSIX 操作系统上都是如此。尽管检查了钩子脚本的顺序,并测试了整个过程。在自动化修复连接的证书之前的任何窗口都可能长达数秒。
我的简单钩子/etc/letsencrypt/renewal-hooks/deploy/fullchain.sh
只是将每个活动钥匙+链连接起来,并活动存储在其中。
#!/bin/bash
# https://github.com/certbot/certbot/issues/1201
for dir in $(ls -d /etc/letsencrypt/live/*); do
cat $dir/privkey.pem $dir/fullchain.pem > $dir/privkey+fullchain.pem
done
在这个特定的盒子上,我选择让 certbot 更新负责重新加载守护进程,因为它知道何时真正发生更新。不是 systemd 单元。 /etc/letsencrypt/renewal-hooks/deploy/web.sh
也非常简单:
#!/bin/sh
/usr/bin/systemctl reload nginx