Всем привет!

Однажды администратор одного из внутренних сайтов предприятия попросил прописать TXT запись для получения Let's Encrypt сертификата, поскольку сайт не доступен снаружи и, нет возможности настроить проверку HTTP-01. Через три месяца попросил прописать еще раз, для продления, потом появился второй такой сайт, и, стало очевидно, что процесс пора автоматизировать. Уже перед публикацией нашлась отличная статья с полезными комментариями, автору понадобилась та же проверка DNS-01 и стандарт RFC 2136 для автоматизации выпуска 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

Для первого сайта стоит провести Проверки работоспособности

Процесс выпу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# nano /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 и как с ними работать, приглашаю посмотреть мой вебинар: "Все, что нужно знать про Let's Encrypt: от localhost до Kubernetes"

Спасибо!