我按照本指南在 Ubuntu 14.03 上安装了 letsencrypt:
我还按照指南中所述创建了一个用于证书更新的 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 本身。