正确设置Certbot的Deploy Hook

我一般都用certbot来申请免费ssl证书,有时候申请完了需要把证书复制到别的目录和修改一些文件属性供别的程序使用。这个时候certbot提供了deploy-hook让我们可以自己写一个脚本,在成功申请证书之后做一些自定义的操作,只需要把脚本写好后放到/etc/letsencrypt/renewal-hooks/deploy目录,并且赋予可执行属性就行。但最近我发现这个deploy-hook在手工renew的时候是正常调用的,通过计划任务(以前是cronjob现在是system timer)工作的时候,这个deploy-hook完全没有工作。

一开始我以为是脚本写的有问题,在计划任务和手工执行时是不是有什么环境变量不同造成执行失败,检查/var/log/letsencrypt之后发现计划任务中完全跳过了deploy-hook的执行,但手工执行certbot renew的时候log里是执行了的。

查阅文档后我发现我对这个deploy-hook的工作条件有个错误的认识,我以为只要放到deploy目录下就可以了,对手工执行certbot renew的情况来说是这样的。但对于计划更新任务来说,具体更新的参数和执行哪些hook,是参考/etc/letsencrypt/renewal/yourdomain.com.conf这个配置文件的。如果这个配置文件里没有写deploy-hook,那么更新整数时是不会执行的。

而这个配置文件,是你在第一次申请证书的时候创建的。 第一次申请的时候如果添加上了--deploy-hook的参数告知了deploy-hook脚本路径,那么配置文件中就会添加上deploy-hook的配置,之后每次自动更新的时候也会执行deploy-hook,否则就不会。

所以在首次申请证书时应该这样写

certbot certonly -d $domain -m $mail --agree-tos --standalone --deploy-hook /etc/letsencrypt/renewal-hooks/deploy/your-hook-script.sh

这里的your-hook-script.sh当然是你预先准备好的hook脚本。

如果这是你的certbot安装后首次运行,/etc/letsencrypt/整个目录都不会存在,可以先dry run一下让certbot生成所有必须的目录结构:

certbot certonly -d $domain -m $mail --agree-tos --standalone --dry-run

然后在放置好脚本,执行上面的正式申请操作。

如果你已经申请过证书了,现在希望修改配置让deploy-hook在每次自动计划更新后都执行,可以手工在/etc/letsencrypt/renewal/yourdomain.com.conf配置文件的[renewalparams]配置段下增加一行配置信息:

renew_hook = /etc/letsencrypt/renewal-hooks/deploy/your-hook-script.sh

不需要重启什么服务,保存配置文件即可。