使用 Let's Encrypt certbot 时,如何仅重新启动/重新加载网络服务一次,并且仅在证书实际更新时才执行?

使用 Let's Encrypt certbot 时,如何仅重新启动/重新加载网络服务一次,并且仅在证书实际更新时才执行?

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 时我会忘记复制的脚本;-)

相关内容