Я установил letsencrypt на Ubuntu 14.03, следуя этому руководству:
Я также создал задание cron для обновления сертификата, как описано в руководстве, но затем обнаружил следующую проблему:
certbot-auto renew
(как пользователь без полномочий root) и sudo certbot-auto renew
оба работают при тестировании из командной строки (certbot сообщает, что сертификаты еще не подлежат обновлению, как и ожидалось)Есть идеи, почему у меня такое другое поведение? В чем разница между запуском команды вручную на консоли оболочки и ее запуском с помощью cron?
Обновить: я добавил --no-self-upgrade
но это не имело никакого значения. При дальнейшем исследовании я заметил следующее:
sudo certbot-auto renew --dry-run
работает отличноsudo su; certbot-auto renew --dry-run
сначала пытается обновить certbotПо какой-то причине certbot, похоже, думает, что он неправильно установлен при работе во второй форме.
Эта проблема возникает из-за способа certbot
был установлен.
Когда не используется пакетный дистрибутив, установка certbot
, он не может гарантировать, что все зависимости соблюдены, поэтому, чтобы убедиться, что он может работать правильно, он создает виртуальную среду в вашем $HOME
. При работе с sudo
, это все еще твое $HOME
. Однако при запуске с правами root это превращается в /root
где виртуальная среда отсутствует и, следовательно, certbot
не может работать, не создав его. Он не столько обновляется, сколько устанавливается с учетом новой среды, в которой он запущен.
РЕДАКТИРОВАТЬ:
Проблема заключалась в том, что certbot-auto сначала запускался (инициализировался) с использованием sudo, в то время как cron запускал его от имени пользователя root. Это результат попытки certbot-auto установить зависимости при выполнении cron / root.
Решением было бы запустить certbot-auto как root, а не использовать sudo.
Я все еще хочу упомянуть --no-self-upgrade, так как это предотвратит попытки certbot-auto обновить себя. Полезно при выполнении заданием cron, поскольку вы можете / должны отслеживать любые обновления, время от времени запуская их вручную.
Я не вижу никакой разницы при тестировании здесь на Debian Jessie с использованием последней версии certbot-auto. Вы можете добавить к команде '--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.