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