当 letsencrypt 的 certbot 作为 cron 任务运行时,行为有所不同

当 letsencrypt 的 certbot 作为 cron 任务运行时,行为有所不同

我按照本指南在 Ubuntu 14.03 上安装了 letsencrypt:

https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-14-04

我还按照指南中所述创建了一个用于证书更新的 cron 作业,但随后发现了以下问题:

  • certbot-auto renew(作为非 root 用户)并且sudo certbot-auto renew从命令行测试时两者均可正常工作(certbot 报告证书尚未到期续订,正如预期的那样)
  • 但是,当 cron(以 root 身份)运行相同的命令时,certbot 会尝试自行升级。

知道为什么我会得到这种不同的行为吗?在 shell 控制台上手动运行命令和通过 cron 运行命令有什么区别?

更新:我添加了--no-self-upgrade,但没有任何变化。经过进一步调查,我注意到以下情况:

  • sudo certbot-auto renew --dry-run工作正常
  • sudo su; certbot-auto renew --dry-run首先尝试升级 certbot

由于某种原因,certbot 似乎认为在第二种形式下运行时它没有正确安装。

答案1

certbot出现该问题的原因在于安装方式。

当不使用 的打包分发安装时certbot,它无法确保满足所有依赖项,因此为了确保它能够正常运行,它会在您的 中创建一个虚拟环境$HOME。当使用 运行时sudo,这仍然是您自己的$HOME。但是,当以 root 身份运行时,这会转到/root虚拟环境不存在的位置,因此,certbot如果不创建它,就无法运行。考虑到它运行的新环境,它不是在升级自身,而是在安装自身。

答案2

编辑:

这里的问题是,certbot-auto 首先使用 sudo 运行(初始化),而 cron 以 root 用户身份运行它。这导致 certbot-auto 在由 cron/root 执行时尝试安装依赖项。

解决方案是以 root 身份运行 certbot-auto,而不是使用 sudo。

我还是想提一下 --no-self-upgrade,因为这将阻止 certbot-auto 尝试自我升级。当由 cronjob 执行时很有用,因为您可以/应该通过不时手动运行来监控任何升级。


使用最新的 certbot-auto 在 Debian Jessie 上进行测试时,我没有发现任何差异。您可以在命令中添加“--no-self-upgrade”。这样 certbot-auto 就不会检查新版本。

我在'/etc/cron.d/letsencrypt' 中有这个

# Check if we need to renew any certificates

4 4 * * * /opt/letsencrypt/certbot-auto renew --quiet --no-self-upgrade --post-hook "service nginx restart" >/dev/null 2>&1

它将每天运行一次,然后重新启动 nginx(如果它必须更新任何证书),但不会尝试更新 certbot-auto 本身。

相关内容