Итак
Нужно настроить автоматическое обновление 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_key — Global API Key из закладки API tokens
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

- Системный администратор с 2000 года
- Участник Хабр Q&A и cyberforum
- Кейсы