【问题标题】:Nginx not taking into account renewed let's encrypt certificatesNginx 不考虑更新让我们加密证书
【发布时间】:2018-08-11 09:16:19
【问题描述】:

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

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

然后我使用letsencrypt在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 网络服务器不提供新证书!

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

30 6 * * 3 service nginx restart

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

我的设置有什么问题?

谢谢

【问题讨论】:

  • 你解决了吗?我只能认为 nginx reload 还不够,可能需要停止启动。除此之外,是否可以选择使用 MeteorUp: github.com/zodern/meteor-up ?它使用 docker 并内置 Lets Encrypt。
  • 我还没有解决这个问题,我需要花时间深入研究 cron 作业日志......我确认重新加载足以在我手动执行时考虑新证书。就我而言,MeteorUp 不是一个选项,但我会看看他们如何更新证书。
  • 我刚刚想到的唯一另一件事是 cron 作业可能需要以 root / sudo 用户身份运行。

标签: ssl nginx renewal


【解决方案1】:

您可以在一个 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 参数已添加到 certbot 版本 0.17,于 2017 年 7 月发布

【讨论】:

  • 感谢您的回答,我猜我的回答中缺少 --deploy-hook。你能解释一下 crontab 行的开头吗? (从“root”到“certbot”)我不明白它的作用。谢谢,
  • 这是安装“Certbot”时自动设置的基本 crontab,基本上它检查证书是否在接下来的 30 天内过期。如果它即将过期,那么它将自动更新它
【解决方案2】:

经过更多测试,这里是这个问题的答案:

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

12 6 * * 3 /root/renew.sh

并像这样设置 bash 脚本:

certbot renew
sleep 1m
service nginx reload

注意sleep 命令的存在,它允许等待更新完成

【讨论】:

    猜你喜欢
    • 2016-12-28
    • 2019-10-20
    • 1970-01-01
    • 2018-09-27
    • 2021-06-02
    • 2020-06-29
    • 2020-07-20
    • 1970-01-01
    • 2017-09-08
    相关资源
    最近更新 更多