Продление сертификата Let's Encrypt через systemd

Текущий рецеп основан на статье "Renew let’s encrypt SSL via systemd". Изменены только пути и время запуска - для соответствия статье по настройке получения сертификата "Настройка Nginx с Let's Encrypt на CentOS 7". В результате описанных в данной статье действий, сертификат будет обновляться не через cron, а с помощью таймера systemd.
Итак. Шаги для настройки автоматического продления сертификатов (которые выдаются на 90 дней).

1. Создаём сервис systemd:

sudo nano /etc/systemd/system/letsencrypt.service
Вставляем такое содержимое:
[Unit]
Description=Renews letsencrypt certificates
After=network.target

[Service]
Type=oneshot
WorkingDirectory=/opt/letsencrypt/
ExecStart=/opt/letsencrypt/letsencrypt-auto renew

2. Создаём таймер для запуска:

sudo nano /etc/systemd/system/letsencrypt.timer
Вставляем такое содержимое:
[Unit]
Description=letsencrypt timer

[Timer]
OnCalendar=*-*-10 02:12:0
Persistent=true
Unit=letsencrypt.service

[Install]
WantedBy=basic.target
Это позволит запускать обновление каждый месяц 10-го числа в 2:12 ночи. День нужно подставить свой (например, за день относительно даты получения вашего сертификата). Если ваши сертификаты выданы в разные дни, то, возможно, вам лучше будет поставить на ежедневное выполнение. Различные примеры настроек таймеров можно подсмотреть в статье "Systemd.timer. Запуск задач по расписанию".
Активируем таймер для автоматического старта после перезагрузки:
sudo systemctl enable letsencrypt.timer
Запускаем таймер:
sudo systemctl start letsencrypt.timer

3. После того, как сертификаты будут продлены, нужно перегрузить nginx.

Сделаем это также через systemd. Создадим каталог для настройки:
sudo mkdir /etc/systemd/system/letsencrypt.service.d
Создадим настройку:
sudo nano /etc/systemd/system/letsencrypt.service.d/nginx.conf
С таким содержимым:
[Service]
ExecStartPost=/usr/bin/systemctl reload nginx

4. Теперь можно всё протестировать.

Перезагрузим systemd, чтобы определился новый сервис:
sudo systemctl daemon-reload
Запустим сервис:
sudo systemctl start letsencrypt.service
Результат работы сервиса можно пронаблюдать в сообщениях лога:
journalctl -f

Дополнительная заметка об ошибке при продлении

Во время продления сертификата на свой поддомен с NextCloud возникали ошибки вида:
Processing /etc/letsencrypt/renewal/nc.mydomen.ru.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator webroot, Installer None
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for nc.mydomen.ru
Waiting for verification...
Cleaning up challenges
Attempting to renew cert (nc.mydomen.ru) from /etc/letsencrypt/renewal/nc.mydomen.ru.conf produced an unexpected error: Failed authorization procedure. nc.mydomen.ru (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://nc.mydomen.ru/.well-known/acme-challenge/aA1vd8UBtTg7fOd-Hr39kAprUSNByU7DG-QaMXq37ig: "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">                                                                                                                                          

<html xmlns="http://www.w3.or". Skipping.                                                                                                                   
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/nc.mydomen.ru/fullchain.pem (failure)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/mydomen.ru/fullchain.pem expires on 2018-11-09 (skipped)
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/nc.mydomen.ru/fullchain.pem (failure)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 renew failure(s), 0 parse failure(s)
Очень долго пытался исправить ошибку путём настройки конфига nginx для URI .well-known/acme-challenge. Оказалось напрасно. Решилось заменой плагина, который используется для продления сертификата. Был webroot, стал nginx. В конфиге /etc/letsencrypt/renewal/nc.mydomen.ru.conf:
[renewalparams]
authenticator = nginx

Комментарии

Популярные сообщения из этого блога

Socks5 proxy на CentOS 7

Bitrix24 API - разбор демо приложения третьего типа

Подсветка лестницы