====== Let's Encrypt для внутренних сайтов ====== * [[https://habr.com/ru/articles/568378/|Использование Let's Encrypt для внутренних серверов]] * [[https://blog.svedr.in/posts/letsencrypt-dns-verification-using-a-local-bind-instance/|LetsEncrypt DNS verification using a local BIND instance]] * [[https://certbot-dns-rfc2136.readthedocs.io/en/stable/|Welcome to certbot-dns-rfc2136’s documentation!]] Всем привет! Однажды администратор одного из внутренних сайтов предприятия попросил прописать TXT запись для получения Let's Encrypt сертификата, поскольку сайт не доступен снаружи и, нет возможности настроить проверку [[https://letsencrypt.org/ru/docs/challenge-types/#проверка-http-01|HTTP-01]]. Через три месяца попросил прописать еще раз, для продления, потом появился второй такой сайт, и, стало очевидно, что процесс пора автоматизировать. Уже перед публикацией нашлась [[https://habr.com/ru/articles/925358/|отличная статья]] с полезными комментариями, автору понадобилась та же [[https://letsencrypt.org/ru/docs/challenge-types/#проверка-dns-01|проверка DNS-01]] и стандарт RFC 2136 для автоматизации выпуска [[https://ru.wikipedia.org/wiki/Wildcard-сертификат|wildcard сертификата]] Так, что, предлагаю краткую "шпаргалку с заменой по Ctrl+H", для тех, кто использует сервер DNS сервер bind и хочет делегировать выпуск/проверку Let`s Encrypt сертификатов для внутренних сайтов сторонним подразделениям. Инструкция для администратора DNS сервера: Назначьте IP адрес для очередного внутреннего сайта и опишите зону, для будущей DNS-01 проверки с единственным DNS сервером (не забудьте увеличить номер версии зоны:) dns# nano /etc/bind/yourdomain.ru ... anysiteN A A.B.C.D *.anysiteN CNAME anysiteN _acme-challenge.anysiteN NS ns ... Создайте файл ключа с соответствующим именем, назначьте права и добавьте его к конфигурации DNS сервера dns# rndc-confgen -a -A hmac-sha512 -k "certbot.anysiteN" -c /etc/bind/certbot.anysiteN.key dns# chmod 640 /etc/bind/certbot.anysiteN.key dns# nano /etc/bind/named.conf ... include "/etc/bind/certbot.anysiteN.key"; ... Создайте минимальный файл зоны, в каталоге и, с правами, которые, в дальнейшем, позволят редактировать его через сервис named dns# sudo -u bind nano /var/lib/bind/_acme-challenge.anysiteN.yourdomain.ru $TTL 1h _acme-challenge.anysiteN.yourdomain.ru. IN SOA ns.yourdomain.ru. noc.yourdomain.ru. 1 1d 12h 1w 1h NS ns.yourdomain.ru. Добавьте поддержку зоны в настройки DNS сервера, и укажите права на добавление в нее TXT записей для созданного ключа dns# nano /etc/bind/named.conf.local ... zone "_acme-challenge.anysiteN.yourdomain.ru" { type master; file "/var/lib/bind/_acme-challenge.anysiteN.yourdomain.ru"; update-policy { grant certbot.anysiteN name _acme-challenge.anysiteN.yourdomain.ru. TXT; }; }; ... Протестируйте и обновите конфигурацию dns# named-checkconf -z dns# rndc reload Для первого сайта стоит провести [[https://habr.com/ru/articles/925358/|Проверки работоспособности]] Процесс выпуcка/обновления сертификатов будет сопровождаться появлением в журнале записей вида: dns# journalctl | grep -i _acme-challenge.anysiteN ... Dec 22 12:48:40 ns named[213146]: client @0x7f47161dac98 195.19.40.42#45142/key certbot.anysite: view dmz: updating zone '_acme-challenge.anysiteN.yourdomain.ru/IN': adding an RR at '_acme-challenge.anysiteN.yourdomain.ru' TXT "JikZ0ZHCUv4Bdk5AQ7DimCHAf46xeBAOOEu_-PPbH2U" Dec 22 12:49:44 ns named[213146]: client @0x7f4711727c98 195.19.40.42#33991/key certbot.anysite: view dmz: updating zone '_acme-challenge.anysiteN.yourdomain.ru/IN': deleting an RR at _acme-challenge.anysiteN.yourdomain.ru TXT ... Если все работает, извлекаем имя и значение ключа из файла dns# less /etc/bind/certbot.anysiteN.key и "подставляем" в инструкцию для администратора сайта Инструкция для администратора сайта: 1. Установите плагин certbot-dns, в debian/ubuntu делается так: anysiteN# apt install python3-certbot-dns-rfc2136 2. Создайте файл конфигурации с таким содержимым: anysiteN# cat /etc/certbot-credentials.ini dns_rfc2136_server = 172.19.32.2 dns_rfc2136_port = 53 dns_rfc2136_name = certbot.anysiteN dns_rfc2136_secret = d+P0fg32FsGV0CYOTmWBkQLjG4KnUNNNNNNNNNNNNNNNNNNNNNNNNNNNNN9QF5pzH+MpbYqGa1WB/yh1Q== dns_rfc2136_algorithm = HMAC-SHA512 3. Назначьте права доступа к нему: anysiteN# chmod 640 /etc/certbot-credentials.ini 4. Запросите сертификаты и убедитесь в их создании anysiteN# certbot certonly --dns-rfc2136 --dns-rfc2136-credentials /etc/certbot-credentials.ini -d 'anysiteN.yourdomain.ru' -d '*.anysiteN.yourdomain.ru' ... IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/anysiteN.yourdomain.ru/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/anysiteN.yourdomain.ru/privkey.pem 6. Для автоматического продления убедитесь в создании файла конфигурации и наличии таймеров и сервисов anysiteN:~# cat /etc/letsencrypt/renewal/anysiteN.yourdomain.ru.conf anysiteN# systemctl status certbot.timer ... Active: active (waiting) ... ... anysiteN# systemctl show certbot.service ... TriggeredBy: ● certbot.timer ... На этом все, но, если хотите посмотреть с самого начала, что такое сертификаты Let's Encrypt и как с ними работать, приглашаю посмотреть мой вебинар: [[https://rutube.ru/video/61ae7d137f22c4180c186e32683f731f/|"Все, что нужно знать про Let's Encrypt: от localhost до Kubernetes"]] Спасибо!