This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
let_s_encrypt_для_внутренних_сайтов [2025/12/21 08:46] val |
let_s_encrypt_для_внутренних_сайтов [2025/12/26 17:08] (current) val |
||
|---|---|---|---|
| Line 6: | Line 6: | ||
| - | Всем привет! Однажды администратор одного из внутренних сайтов предприятия попросил прописать TXT запись для получения Let's Encrypt сертификата, поскольку сайт не доступен снаружи и нет возможности использовать проверку HTTP-01. Через три месяца попросил прописать другую, для продления, потом появился второй такой сайт, и, стало очевидно, что процесс пора автоматизировать. Уже после настройки нашлась хорошая статья https://habr.com/ru/articles/925358/, автору которой понадобилась валидация DNS-01 challenge и стандарт RFC 2136 для выпуска wildcard сертификата от Let`s Encrypt, поэтому в данной публикации добавлен момент делегирования управления необходимыми записями для внутренних сайтов подразделений в DNS сервере BIND | + | Всем привет! |
| + | Однажды администратор одного из внутренних сайтов предприятия попросил прописать 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 сервером (не забудьте увеличить номер версии зоны:) | ||
| <code> | <code> | ||
| - | dns# cat /etc/bind/yourdomain.ru | + | dns# nano /etc/bind/yourdomain.ru |
| ... | ... | ||
| - | anysite A N.N.N.N | + | anysiteN A A.B.C.D |
| - | *.anysite CNAME anysite | + | *.anysiteN CNAME anysiteN |
| - | _acme-challenge.anysite NS ns | + | _acme-challenge.anysiteN NS ns |
| ... | ... | ||
| + | </code> | ||
| - | dns# cat /etc/bind/named.conf.local | + | Создайте файл ключа с соответствующим именем, назначьте права и добавьте его к конфигурации DNS сервера |
| + | <code> | ||
| + | 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 | ||
| ... | ... | ||
| - | zone "_acme-challenge.anysite.yourdomain.ru" { | + | include "/etc/bind/certbot.anysiteN.key"; |
| - | type master; | + | |
| - | file "/var/lib/bind/_acme-challenge.anysite.yourdomain.ru"; | + | |
| - | update-policy { | + | |
| - | grant certbot.anysite name _acme-challenge.anysite.yourdomain.ru. txt; | + | |
| - | }; | + | |
| - | }; | + | |
| ... | ... | ||
| + | </code> | ||
| - | dns# sudo -u bind nano /var/lib/bind/_acme-challenge.anysite.yourdomain.ru | + | Создайте минимальный файл зоны, в каталоге и, с правами, которые, в дальнейшем, позволят редактировать его через сервис named |
| + | <code> | ||
| + | dns# sudo -u bind nano /var/lib/bind/_acme-challenge.anysiteN.yourdomain.ru | ||
| - | $TTL 30 ; 30 seconds | + | $TTL 1h |
| - | _acme-challenge.anysite.yourdomain.ru. IN SOA ns.yourdomain.ru. noc.yourdomain.ru. ( | + | _acme-challenge.anysiteN.yourdomain.ru. IN SOA ns.yourdomain.ru. noc.yourdomain.ru. 1 1d 12h 1w 1h |
| - | 1 ; serial | + | |
| - | 86400 ; refresh (1 day) | + | |
| - | 43200 ; retry (12 hours) | + | |
| - | 604800 ; expire (1 week) | + | |
| - | 30 ; minimum (30 seconds) | + | |
| - | ) | + | |
| NS ns.yourdomain.ru. | NS ns.yourdomain.ru. | ||
| - | + | </code> | |
| - | dns# rndc-confgen -a -A hmac-sha512 -k "certbot.anysite" -c /etc/bind/certbot.anysite.key | + | |
| - | dns# chmod 640 /etc/bind/certbot.anysite.key | + | Добавьте поддержку зоны в настройки DNS сервера, и укажите права на добавление в нее TXT записей для созданного ключа |
| - | + | <code> | |
| - | dns# cat /etc/bind/named.conf | + | dns# nano /etc/bind/named.conf.local |
| ... | ... | ||
| - | include "/etc/bind/certbot.anysite.key"; | + | 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; | ||
| + | }; | ||
| + | }; | ||
| ... | ... | ||
| + | </code> | ||
| - | dns# named-checkconf -z | less | + | Протестируйте и обновите конфигурацию |
| + | <code> | ||
| + | dns# named-checkconf -z | ||
| dns# rndc reload | dns# rndc reload | ||
| + | </code> | ||
| - | dns# nsupdate -k /etc/bind/certbot.anysite.key | + | Для первого сайта стоит провести [[https://habr.com/ru/articles/925358/|Проверки работоспособности]] |
| - | > server 127.0.01 | + | |
| - | dns# less /etc/bind/certbot.anysite.key | + | Процесс выпуcка/обновления сертификатов будет сопровождаться появлением в журнале записей вида: |
| + | <code> | ||
| + | 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 | ||
| + | ... | ||
| + | </code> | ||
| + | Если все работает, извлекаем имя и значение ключа из файла | ||
| - | dns# scp /etc/bind/certbot.anysite.key user@anysite: | + | <code> |
| - | + | dns# less /etc/bind/certbot.anysiteN.key | |
| - | user@anysite:~$ nsupdate -k certbot.anysite.key | + | </code> |
| - | > server <IP адрес dns сервера> | + | |
| - | + | ||
| - | + | ||
| - | > zone _acme-challenge.anysite.yourdomain.ru | + | |
| - | > update add _acme-challenge.anysite.yourdomain.ru. 30 IN TXT "test_txt_record 1" | + | |
| - | > send | + | |
| - | > update del _acme-challenge.anysite.yourdomain.ru. 30 IN TXT "test_txt_record 1" | + | |
| - | > send | + | |
| - | > quit | + | |
| - | + | ||
| - | # any-any-site# nslookup -q=TXT _acme-challenge.anysite.yourdomain.ru | + | |
| - | # any-any-site# host -t TXT _acme-challenge.anysite.yourdomain.ru | + | |
| - | # any-any-site# dig TXT _acme-challenge.anysite.yourdomain.ru | + | |
| - | + | ||
| - | ==== | + | |
| - | Что необходимо сделать: | + | |
| - | 1. Установить плагин certbot-dns, в debian/ubuntu делается так: | + | и "подставляем" в инструкцию для администратора сайта |
| - | anysite# apt install python3-certbot-dns-rfc2136 | + | Инструкция для администратора сайта: |
| - | 2. Создать файл конфигурации с таким содержимым: | + | 1. Установите плагин certbot-dns, в debian/ubuntu делается так: |
| - | + | <code> | |
| - | anysite# cat /etc/certbot-credentials.ini | + | anysiteN# apt install python3-certbot-dns-rfc2136 |
| - | dns_rfc2136_server = 195.19.32.2 | + | </code> |
| + | 2. Создайте файл конфигурации с таким содержимым: | ||
| + | <code> | ||
| + | anysiteN# cat /etc/certbot-credentials.ini | ||
| + | dns_rfc2136_server = 172.19.32.2 | ||
| dns_rfc2136_port = 53 | dns_rfc2136_port = 53 | ||
| - | dns_rfc2136_name = certbot.anysite | + | dns_rfc2136_name = certbot.anysiteN |
| dns_rfc2136_secret = d+P0fg32FsGV0CYOTmWBkQLjG4KnUNNNNNNNNNNNNNNNNNNNNNNNNNNNNN9QF5pzH+MpbYqGa1WB/yh1Q== | dns_rfc2136_secret = d+P0fg32FsGV0CYOTmWBkQLjG4KnUNNNNNNNNNNNNNNNNNNNNNNNNNNNNN9QF5pzH+MpbYqGa1WB/yh1Q== | ||
| dns_rfc2136_algorithm = HMAC-SHA512 | dns_rfc2136_algorithm = HMAC-SHA512 | ||
| - | + | </code> | |
| - | 3. Назначить права доступа к нему: | + | 3. Назначьте права доступа к нему: |
| - | + | <code> | |
| - | anysite# chmod 640 /etc/certbot-credentials.ini | + | anysiteN# chmod 640 /etc/certbot-credentials.ini |
| - | + | </code> | |
| - | 4. Запросить сертификаты и убедиться в их создании | + | 4. Запросите сертификаты и убедитесь в их создании |
| - | + | <code> | |
| - | anysite# certbot certonly --dns-rfc2136 --dns-rfc2136-credentials /etc/certbot-credentials.ini -d 'anysite.yourdomain.ru' -d '*.anysite.yourdomain.ru' | + | anysiteN# certbot certonly --dns-rfc2136 --dns-rfc2136-credentials /etc/certbot-credentials.ini -d 'anysiteN.yourdomain.ru' -d '*.anysiteN.yourdomain.ru' |
| ... | ... | ||
| IMPORTANT NOTES: | IMPORTANT NOTES: | ||
| - Congratulations! Your certificate and chain have been saved at: | - Congratulations! Your certificate and chain have been saved at: | ||
| - | /etc/letsencrypt/live/anysite.yourdomain.ru/fullchain.pem | + | /etc/letsencrypt/live/anysiteN.yourdomain.ru/fullchain.pem |
| Your key file has been saved at: | Your key file has been saved at: | ||
| - | /etc/letsencrypt/live/anysite.yourdomain.ru/privkey.pem | + | /etc/letsencrypt/live/anysiteN.yourdomain.ru/privkey.pem |
| - | + | </code> | |
| - | 5. Для автоматического продления убедиться в создании файла конфигурации и, наличии таймеров и сервисов | + | 6. Для автоматического продления убедитесь в создании файла конфигурации и наличии таймеров и сервисов |
| - | + | <code> | |
| - | anysite:~# cat /etc/letsencrypt/renewal/anysite.yourdomain.ru.conf | + | anysiteN:~# cat /etc/letsencrypt/renewal/anysiteN.yourdomain.ru.conf |
| - | anysite# systemctl status certbot.timer | + | anysiteN# systemctl status certbot.timer |
| ... | ... | ||
| Active: active (waiting) ... | Active: active (waiting) ... | ||
| ... | ... | ||
| - | anysite# systemctl show certbot.service | + | anysiteN# systemctl show certbot.service |
| ... | ... | ||
| TriggeredBy: ● certbot.timer | TriggeredBy: ● certbot.timer | ||
| ... | ... | ||
| + | </code> | ||
| + | |||
| + | На этом все, но, если хотите посмотреть с самого начала, что такое сертификаты Let's Encrypt и как с ними работать, приглашаю посмотреть мой вебинар: [[https://rutube.ru/video/61ae7d137f22c4180c186e32683f731f/|"Все, что нужно знать про Let's Encrypt: от localhost до Kubernetes"]] | ||
| Спасибо! | Спасибо! | ||
| - | ==== | ||
| - | |||
| - | dns# journalctl | grep -i _acme-challenge.anysite | ||
| - | ... | ||
| - | Nov 26 14:06:37 ns named[213146]: client @0x7f4711f3f898 195.19.32.16#60008/key certbot.anysite: view yourdomainnet: updating zone '_acme-challenge.anysite.yourdomain.ru/IN': adding an RR at '_acme-challenge.anysite.yourdomain.ru' TXT "7VqXPt5zZ36jRFe9A61om1OALWFloaI2Rz7_OGtFYpM" | ||
| - | Nov 26 14:06:37 ns named[213146]: client @0x7f471200dc98 195.19.32.16#60020/key certbot.anysite: view yourdomainnet: updating zone '_acme-challenge.anysite.yourdomain.ru/IN': adding an RR at '_acme-challenge.anysite.yourdomain.ru' TXT "O67R1nFhhli0YaMQ2j-AtefRO0wr7mUwICbtzGnR_64" | ||
| - | Nov 26 14:07:43 ns named[213146]: client @0x7f4711ab5498 195.19.32.16#36166/key certbot.anysite: view yourdomainnet: updating zone '_acme-challenge.anysite.yourdomain.ru/IN': deleting an RR at _acme-challenge.anysite.yourdomain.ru TXT | ||
| - | Nov 26 14:07:43 ns named[213146]: client @0x7f4711f38898 195.19.32.16#36180/key certbot.anysite: view yourdomainnet: updating zone '_acme-challenge.anysite.yourdomain.ru/IN': deleting an RR at _acme-challenge.anysite.yourdomain.ru TXT | ||
| - | ... | ||
| - | </code> | ||