И очередной раз я посыпаю голову пеплом, так как вот уже около года на одном из моих пет-прожектов spaceismine.org протух Let’s Encrypt сертификат, а я даже и не думал шевелиться. Что ж, рано или поздно всё равно нужно исправляться. Приступаю.

Бегло заглянув на сайт этого замечательного проекта с бесплатными сертификатами, я отыскал нужный себе раздел и примерно понял, что нужно делать. Год развития проекта дал о себе знать, теперь существует прокачанная утилита, распространяемая через deb-пакет. Ставим её.

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install letsencrypt

Да, приходится подключать отдельный PPA, так как в Ubuntu 16.04 (которая у меня) этот пакет довольно старый, и в нём нет поддержки ключа --post-hook, который нам понадобится ниже.

Судя по всему, написано там всё на питоне. Итак, поставив certbot, я сделал для проверки успешности своих намерений dry-run запуск (так называемый запуск вхолостую, который по факту ничего не делает, а только показывает отчёт), как это предлагалось в документации certbot.

sudo letsencrypt renew --dry-run --agree-tos

Processing /etc/letsencrypt/renewal/spaceismine.org.conf
** DRY RUN: simulating 'letsencrypt renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/spaceismine.org/fullchain.pem (success)
** DRY RUN: simulating 'letsencrypt renew' close to cert expiry
**          (The test certificates above have not been saved.)

Success-success, успех-успех! Ну, дальше можно было уже запустить и полноценное обновление сертификата.

sudo letsencrypt renew

Processing /etc/letsencrypt/renewal/spaceismine.org.conf
new certificate deployed without reload, fullchain is /etc/letsencrypt/live/spaceismine.org/fullchain.pem

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/spaceismine.org/fullchain.pem (success)

Замечательно, он говорит, что всё нам обновил. Делаем релоад нашему nginx.

sudo service nginx reload

И вот всё, сертификат обновлён, всё замечательно. Но, не буду же я раз в 3 месяца заходить обновлять его руками, поэтому я поискал информацию, как лучше всего это прикрутить на cron. Оказывается, ничего особо сложного с этим тоже не было.

sudo crontab -e

и добавляем там

42 0,12 * * * letsencrypt renew --post-hook "service nginx reload"

“Зачем делать два раза в день?” спросите вы. Да, это довольно часто, но я столкнулся с мнениями, что в этом нет ничего такого, так как certbot ничего не делает, если сертификат по факту пока обновлять не требуется. Момент необходимости обновления сертификата наступает за 30 дней до его истечения.

Убеждаемся напоследок, что команда cron работает. Многие годы работы с cron научили меня это делать в обязательном порядке.

sudo letsencrypt renew --post-hook "service nginx reload"

Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/spaceismine.org.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/spaceismine.org/fullchain.pem (skipped)
No renewals were attempted.
No hooks were run.

Итак, похоже всё хорошо и всё работает. На этом завершаю свою заметку про автоматическое обновление сертификатов Let’s Ecnrypt.

Ссылки

  1. Моя прошлогодняя статья про первоначальную настройку Let’s Encrypt
  2. Сайт certbot
  3. Сайт проекта Let’s Encrypt