运行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

我还创build了一个cron作业来进行证书更新(如指南中所述),但后来发现以下问题:

  • certbot-auto renew (作为非root用户), sudo certbot-auto renew在从命令行进行testing时同时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 sudo su; certbot-auto renew --dry-run尝试首先升级certbot

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

出现此问题的原因是certbot安装方式。

当不使用certbot的打包分发安装时,它不能确保所有依赖性都得到满足,以确保它可以正常运行,它会在$HOME创build一个虚拟环境。 使用sudo运行时,这仍然是您自己的$HOME 。 但是,以root身份运行时,会转到/root ,而虚拟环境不存在,因此certbot无法运行而不创build它。 考虑到它所运行的新环境,它不会自我升级。

编辑:

这里的问题是,certbot-auto首先使用sudo运行(初始化),而cron运行它作为root用户。 这在certbot-auto中试图通过cron / root来执行安装依赖关系。

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

我还是想提一下 – 不要自行升级,因为这样会使certbot-auto无法自行升级。 有用的时候由cronjob执行,你可以/应该监视任何升级手动不时手动运行。


在使用最新的certbot-auto在Debian Jessie上进行testing时,我没有看到任何区别。 您可以将“–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本身。