我有几个网站域名由 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
。您可以更改它们,如果它们尚不存在,则可以创建它们。
nginx
FWIW,我有一个安装程序和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
希望这会有所帮助