Nginx不考虑续订让我们加密证书

时间:2018-08-11 09:16:19

标签: ssl nginx renewal

我有一台服务器在内部端口上运行一些NodeJs应用程序(准确地说是MeteorJs)。我使用Nginx来proxy_pass以URL为应用程序的请求。

假设app_1localhost:3000上运行,我可以将app1.domain.com代理传递给localhost:3000,然后添加防火墙规则以限制对端口3000的访问。

然后,我使用letencrypt在app1.domain.com的传入连接上添加SSL。我使用certbot certonly -w /var/www/app1 -d app1.domain.com生成证书,然后将nginx配置文件设置为使用它。

一切正常,直到需要更新证书为止。

要进行续约,我需要执行以下cron工作:

12 6 * * 3 /root/renew.sh

使用以下脚本/root/renew.sh

certbot renew 
service nginx reload

我的问题是,到期时,nginx Web服务器不提供新证书!

所以我添加了以下cron作业:

30 6 * * 3 service nginx restart

,但是它仍然无法刷新证书(这会导致导航器出错,原因是由于证书过期,连接不安全)。因此,我需要手动登录并重新加载nginx。

我的设置有什么问题?

谢谢

2 个答案:

答案 0 :(得分:0)

经过更多测试后,以下是此问题的答案:

将cron作业设置为指向bash脚本:

12 6 * * 3 /root/renew.sh

并按如下所示设置bash脚本:

certbot renew
sleep 1m
service nginx reload

请注意sleep命令的存在,该命令可以等待更新完成

答案 1 :(得分:0)

您可以在一个cronjob行中设置所有内容(修改后的基本设置):

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew --deploy-hook "nginx -t && systemctl restart nginx"

该cron作业每天触发两次,以检查证书在接下来的30天内是否过期。应该不会造成性能问题。

如果它即将过期,它将自动安静地更新它,而不会产生输出,并重新启动NGINX以应用更改。如果证书没有过期,它将不执行任何操作。

请注意,--deploy-hook参数是在2017年7月发布的certbot版本0.17中添加的。