![使用 Let's Encrypt certbot 时,如何仅重新启动/重新加载网络服务一次,并且仅在证书实际更新时才执行?](https://linux22.com/image/766336/%E4%BD%BF%E7%94%A8%20Let's%20Encrypt%20certbot%20%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E4%BB%85%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%2F%E9%87%8D%E6%96%B0%E5%8A%A0%E8%BD%BD%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1%E4%B8%80%E6%AC%A1%EF%BC%8C%E5%B9%B6%E4%B8%94%E4%BB%85%E5%9C%A8%E8%AF%81%E4%B9%A6%E5%AE%9E%E9%99%85%E6%9B%B4%E6%96%B0%E6%97%B6%E6%89%8D%E6%89%A7%E8%A1%8C%EF%BC%9F.png)
该certbot
命令提供了两个在自动续订后运行的钩子,来自文档:
--post-hook POST_HOOK Command to be run in a shell after attempting to obtain/renew certificates. Can be used to deploy renewed certificates, or to restart any servers that were stopped by --pre-hook. This is only run if an attempt was made to obtain/renew a certificate. If multiple renewed certificates have identical post- hooks, only one will be run. (default: None) --deploy-hook DEPLOY_HOOK Command to be run in a shell once for each successfully issued certificate. For this command, the shell variable $RENEWED_LINEAGE will point to the config live subdirectory (for example, "/etc/letsencrypt/live/example.com") containing the new certificates and keys; the shell variable $RENEWED_DOMAINS will contain a space-delimited list of renewed certificate domains (for example, "example.com www.example.com" (default: None)
此问题概述于此 LE 主题(现已关闭)基本上是为了尽量减少对服务的中断。POST_HOOK
每次执行试图即使没有颁发证书,也会进行续订,但只进行一次。这使得可以不必要地重新启动服务。DEPLOY_HOOK
每次运行成功的证书更新。如果一个人使用DEPLOY_HOOK
,并且拥有多个证书,则每个服务可能会重新启动多次,而一次就足够了。有关续订挂钩的更多信息,请点击此处。
我使用一种完全不中断我的服务的发行方法,例如:
certbot certonly --webroot ...
或者
certbot certonly --dns-PROVIDER ...
我只想重新启动/重新加载每个依赖服务一次,并且仅当其证书实际发生改变时。
答案1
我可以通过使用来克服这个限制两个都钩子与一个简单的脚本相结合(发表于这个要点)而不是每次成功续订都会立即触发重新加载/重新启动,其--deploy-hook
/renew_hook
仅分数服务执行某项操作(通过在 下创建临时文件/run
)。然后,当--post-hook
/post_hook
运行时,它会检查标记的服务并仅执行一次必要的操作。这可以保证服务不会发生任何事情,除非它所依赖的证书实际发生更改,并且这种情况只会发生一次。
例如,重新加载 nginx,并在它们共享的证书更新时重新启动 vsftpd:
certbot certonly ... \
--deploy-hook '/usr/local/sbin/read-new-certs-services nginx --restart vsftpd' \
--post-hook /usr/local/sbin/read-new-certs-services
另一个证书可能仅适用于网络,因此它将具有以下挂钩参数:
certbot certonly ... \
--deploy-hook '/usr/local/sbin/read-new-certs-services nginx' \
--post-hook /usr/local/sbin/read-new-certs-services
每次颁发证书时都必须在两个挂钩上使用该脚本,以便不会使用冲突的服务重启方法。
您可以通过编辑现有证书续订/etc/letsencrypt/renewal/*.conf
文件以包含如下[renewalparams]
部分中的挂钩来使用此方法:
renew_hook = /usr/local/sbin/read-new-certs-services nginx -s vsftpd
post_hook = /usr/local/sbin/read-new-certs-services
答案2
我会留下这个答案,因为这个问题是我搜索结果的首要问题,我找到了一个对我有用的不同的解决方案,但它不能满足问题的要求
只有证书确实已续签
因此任何反对票都是应得的。
背景
我用拴住TLS 代理访问家庭助理来自外部。我有 certbot 来更新证书。
certbot 服务处于非活动状态,直到 certbot.timer 启动它。
解决方案
我运行了systemctl edit certbot.service
该命令,创建了文件/etc/systemd/system/certbot.service.d/override.conf
。
在该文件里我输入了以下几行:
[Unit]
Conflicts=hitch.service
OnSuccess=hitch.service
OnFailure=hitch.service
冲突是服务运行前要停止的单元名称列表。 成功时和失败时包含服务运行后启动的单元名称列表。
因此,Hitch 在运行 certbot 之前停止,然后启动。停机时间约为两秒钟。
对于我的问题,我更喜欢这个解决方案,因为它只是覆盖文件中的几行,它将作为的一部分进行备份/etc
,而不是/usr/local/sbin
下次升级运行 Home Assistant 的 Raspberry Pi 时我会忘记复制的脚本;-)