编辑 Certbot 钩子 (letsencrypt)

编辑 Certbot 钩子 (letsencrypt)

我有几个网站域名由 Nginx 处理,我正在使用 Letsencrypt (certbot) 来管理证书。我目前为每个域名都设置了前挂钩和后挂钩:

/etc/init.d/nginx stop
/etc/init.d/nginx start

我想用以下方法替换它们:

systemctl nginx stop
systemctl nginx start

我应该使用哪个命令?

要为网站设置证书,我使用此命令(如果它有帮助):

certbot --installer nginx --authenticator standalone --pre-hook "systemctl stop nginx" --post-hook "/etc/init.d/nginx start"

谢谢 !

答案1

您可以在此文件夹中找到现有的续订配置及其挂钩:

/etc/letsencrypt/renewal/

[renewalparams]配置文件的部分下,前挂钩的键为pre_hook,后挂钩的键为post_hook。您可以更改它们,如果它们尚不存在,则可以创建它们。


nginxFWIW,我有一个安装程序和standalone身份验证器的配置没有任何钩子在 Certbot 0.31 上,无需重新启动即可部署新证书nginx.service

示范:

根@演示[〜] # cat /etc/letsencrypt/renewal/demo.deltik.org.conf
# renew_before_expiry = 30 天
证书 = /etc/letsencrypt/live/demo.deltik.org/cert.pem
私钥 = /etc/letsencrypt/live/demo.deltik.org/privkey.pem
链 = /etc/letsencrypt/live/demo.deltik.org/chain.pem
全链 = /etc/letsencrypt/live/demo.deltik.org/fullchain.pem
版本 = 0.31.0
archive_dir = /etc/letsencrypt/archive/demo.deltik.org

# 续订过程中使用的选项和默认值
[更新参数]
安装程序 = nginx
# 验证器 = 独立
验证器 = 独立
账户 = d41d8cd98f00b204e9800998ecf8427e
#pre_hook = systemctl 停止 nginx.service
#post_hook = systemctl 重启 nginx.service
服务器 = https://acme-v02.api.letsencrypt.org/directory
根@演示[~]# 日期
2019 年 6 月 7 日星期五 14:42:46 UTC
根@演示[~]# certbot 更新          
将调试日志保存到 /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
处理 /etc/letsencrypt/renewal/demo.deltik.org.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
证书尚未到期续订

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

以下证书尚未到期续订:
  /etc/letsencrypt/live/demo.deltik.org/fullchain.pem 将于 2019-08-21 到期(已跳过)
未尝试任何续订。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
根@演示[~]# certbot renew --force-renewal
将调试日志保存到 /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
处理 /etc/letsencrypt/renewal/demo.deltik.org.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
所选插件:Authenticator standalone、Installer nginx
续订现有证书

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
重新加载 nginx 服务器后部署了新证书;fullchain 是
/etc/letsencrypt/live/demo.deltik.org/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

恭喜,所有续订均已成功。以下证书已续订​​:
  /etc/letsencrypt/live/demo.deltik.org/fullchain.pem(成功)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
根@演示[~]# systemctl 状态 nginx
● nginx.service - 高性能 Web 服务器和反向代理服务器
   已加载:已加载(/lib/systemd/system/nginx.service;已启用;供应商预设:已启用)
   活跃:自 2019-05-23 星期四 15:44:40 UTC 以来处于活跃状态(运行);2 周 0 天前
     文档:man:nginx(8)
  进程:2789 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid(code=exited,status=0/SUCCESS)
  进程:2799 ExecStart=/usr/sbin/nginx -g daemon on;master_process on;(代码=退出,状态=0/成功)
  进程:2790 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on;(代码=退出,状态=0/成功)
 主 PID:2811(nginx)
    任务:5(限制:4915)
   CGroup:/system.slice/nginx.service
           ═─2811 nginx:主进程/usr/sbin/nginx -g daemon on; master_process on;
           ─24553 nginx:工作进程
           ─24554 nginx:工作进程
           ─24555 nginx:工作进程
           └─24556 nginx:工作进程

5月23日 15:44:40 demo systemd[1]:正在启动一个高性能web服务器和一个反向代理服务器...
5月23日 15:44:40 demo systemd[1]:已启动一个高性能Web服务器和一个反向代理服务器。
根@演示[~]# openssl s_client -connect demo.deltik.org:443 &1 | openssl x509 -in - -text -noout | grep -A2 '有效性'
        有效性
            不早于:2019 年 6 月 7 日 13:43:35 GMT
            不晚于:2019 年 9 月 5 日 13:43:35 GMT

答案2

Deltik 的答案是解决方案,但我想总结一下以便更清楚。

当您将 nginx 安装程序与 certbot 一起使用时,您不需要添加钩子,因为默认情况下 nginx 安装程序将自行停止并启动。

如果您使用钩子,则在 certbot 尝试执行 post_hook 命令时,更新证书时会出现错误:它会说命令失败,这是因为 Nginx 安装程序已自行启动了 Nginx。这也是您必须手动终止进程并重新启动 nginx 的原因(此问题已在此解决话题

因此解决方案是进入 /etc/letsencrypt/renewal/ 并注释掉 pre_hook 和 post_hook 行。

那么它将正常工作,如果不行,您可以使用以下命令逐个更新您的证书:

certbot --nginx -d yourdomain.com -d www.yourdomain.com

然后尝试进行空运行来模拟更新:

certbot renew --dry-run

希望这会有所帮助

相关内容