Автоматическое обновление letsencrypt wildcard сертификата

Итак

Нужно настроить автоматическое обновление letsencrypt wildcard сертификата для domain.tld и его поддоменов. Названия поддоменов заранее неизвестны

Начальные условия

  • Доступ к настройкам днс через web-интерфейс национального днс-регистратора
  • Веб-сервер nginx для домена и поддоменов настроен и работает. Доступ к сайту по https
  • Новый сертификат подкладывается вручную, что не всегда происходит вовремя и вызывает неудобства для web-мастера
  • ОС сервера — gentoo. Все управление из командной строки

Лирическое отступление. Несколько мыслей

Известно, что letsencrypt выдает сертификаты сроком на 90 дней

Нет проблемы настроить автоматическое обновление для конкретного домена и ряда поддоменов имена которых известны. Однако в настройке автоматического обновления letsencrypt wildcard сертификата есть определенные нюансы

По сообщению searchengines.ru Apple объявила, что браузер Safari начнёт отклонять новые https-сертификаты со сроком действия более 13 месяцев (398 дней) выданные после 1 сентября 2020 года. Это уже может быть проблемой для тех, кто купит двухгодовой сертификат. Таким образом есть повод задуматься о переводе мультидоменного портала на использование letsencrypt wildcard сертификата с автоматическим обновлением

Подготовка

Для реализации проекта нужно установить letsencrypt-клиент автоматического развертывания сертификатов certbot

Для автоматического получения wildcard сертификата необходимо пройти проверку у днс-провайдера. Certbot работает с несколькими днс-провайдерами. Следовательно необходимо дополнительно установить соответствующий плагин

Нужно перенести днс зону domain.tld к одному из таких днс-провайдеров. В моем случае это cloudflare. Настройки NS домена domain.tld остаются у текущего регистратора

Реализация

Устанавливаем certbot для nginx

emerge certbot-nginx

Список подключенных плагинов

certbot plugins

* nginx

* standalone

* webroot

Видно, что нужного плагина для работы с cloudflare нет. Займемся его установкой. И для начала установим pip. Далее нужный плагин и снова посморим на список плагинов

emerge dev-python/pip
pip3 install certbot-dns-cloudflare --user
certbot plugins

* dns-cloudflare

* nginx

* standalone

* webroot

Нужный плагин появился

Теперь в /etc/letsencrypt создадим файл cloudflare.ini в котором укажем

dns_cloudflare_email = admin@domain.tld
dns_cloudflare_api_key = fr1sdeq2bf7621be94ca37c777859ee

email — тот, который указывали при регистрации на cloudflare
api_keyGlobal API Key из закладки API tokens

Инфо! В интерфейсе cloudflare можно сформировать API token и дать нужные права доступа, а затем указать его в dns_cloudflare_api_token вместо dns_cloudflare_email и dns_cloudflare_api_key. Но с таким конфигом при получении сертификата возникает следующая ошибка:

Unable to determine zone_id for domain.tld using zone names: [‘domain.tld’, ‘tld’]. Please confirm that the domain name has been entered correctly and is already associated with the supplied Cloudflare account. The error from Cloudflare was: 0 Actor ‘com.cloudflare.api.token.d6f0polmfee64f00edc7bf2c1a94c2f45’ requires permission ‘com.cloudflare.api.account.zone.list’ to list zones

На момент написания поста оформлен баг-рипорт

chmod 600 cloudflare.ini

Конфиг готов. Пробуем получить сертификат

certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d domain.tld -d "*.domain.tld"

Если все было сделано правильно, то получим следующий результат

IMPORTANT NOTES:
— Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/domain.tld/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/domain.tld/privkey.pem
Your cert will expire on 2020-06-11. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
«certbot renew»

В настройках nginx для домена domain.tld указываем следующее:

ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:!EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4;
ssl_protocols TLSv1.2;
ssl_certificate /etc/letsencrypt/live/domain.tld/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.tld/privkey.pem;
add_header Strict-Transport-Security 'max-age=1800; includeSubDomains';

Проверяем синтаксис

nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Перезапускаем

nginx -s reload

И смотрим в браузере подхватился ли новый сертификат. Если это так, то в cron добавляем следующую запись с выполнением раз в 60 дней

certbot renew && nginx -s reload

Александр Черных
системный администратор

824
0