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 11:44] val |
let_s_encrypt_для_внутренних_сайтов [2025/12/26 17:08] (current) val |
||
|---|---|---|---|
| Line 8: | Line 8: | ||
| Всем привет! | Всем привет! | ||
| - | Однажды администратор одного из внутренних сайтов предприятия попросил прописать 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 сертификата]] от Let`s Encrypt | + | Однажды администратор одного из внутренних сайтов предприятия попросил прописать 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 сертификата]] |
| - | Так, что кратко, может приводиться для тех, кто использует сервер DNS сервер bind, и хочет делегировать выпуск/проверку Let`s Encrypt для внутренних сайтов сторонних подразделений | + | Так, что, предлагаю краткую "шпаргалку с заменой по Ctrl+H", для тех, кто использует сервер DNS сервер bind и хочет делегировать выпуск/проверку Let`s Encrypt сертификатов для внутренних сайтов сторонним подразделениям. |
| - | Назначаем IP адрес для очередного внутреннего сайта и описываем зону, для будущей DNS-01 проверки | + | Инструкция для администратора DNS сервера: |
| + | |||
| + | Назначьте IP адрес для очередного внутреннего сайта и опишите зону, для будущей DNS-01 проверки с единственным DNS сервером (не забудьте увеличить номер версии зоны:) | ||
| <code> | <code> | ||
| - | dns# cat /etc/bind/yourdomain.ru | + | dns# nano /etc/bind/yourdomain.ru |
| ... | ... | ||
| anysiteN A A.B.C.D | anysiteN A A.B.C.D | ||
| Line 22: | Line 24: | ||
| </code> | </code> | ||
| - | Аналогично, упомянутой статье создаем имя и файл ключа, назначаем права и добавляем его к конфигурации DNS сервера | + | Создайте файл ключа с соответствующим именем, назначьте права и добавьте его к конфигурации DNS сервера |
| <code> | <code> | ||
| dns# rndc-confgen -a -A hmac-sha512 -k "certbot.anysiteN" -c /etc/bind/certbot.anysiteN.key | dns# rndc-confgen -a -A hmac-sha512 -k "certbot.anysiteN" -c /etc/bind/certbot.anysiteN.key | ||
| Line 32: | Line 34: | ||
| include "/etc/bind/certbot.anysiteN.key"; | include "/etc/bind/certbot.anysiteN.key"; | ||
| ... | ... | ||
| + | </code> | ||
| + | |||
| + | Создайте минимальный файл зоны, в каталоге и, с правами, которые, в дальнейшем, позволят редактировать его через сервис named | ||
| <code> | <code> | ||
| + | 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. | ||
| + | </code> | ||
| - | Указываем местоположение файла зоны, и права на ее редактирование, для ранее созданного ключа | + | Добавьте поддержку зоны в настройки DNS сервера, и укажите права на добавление в нее TXT записей для созданного ключа |
| <code> | <code> | ||
| - | dns# cat /etc/bind/named.conf.local | + | dns# nano /etc/bind/named.conf.local |
| ... | ... | ||
| zone "_acme-challenge.anysiteN.yourdomain.ru" { | zone "_acme-challenge.anysiteN.yourdomain.ru" { | ||
| Line 42: | Line 53: | ||
| file "/var/lib/bind/_acme-challenge.anysiteN.yourdomain.ru"; | file "/var/lib/bind/_acme-challenge.anysiteN.yourdomain.ru"; | ||
| update-policy { | update-policy { | ||
| - | grant certbot.anysiteN name _acme-challenge.anysiteN.yourdomain.ru. txt; | + | grant certbot.anysiteN name _acme-challenge.anysiteN.yourdomain.ru. TXT; |
| }; | }; | ||
| }; | }; | ||
| ... | ... | ||
| - | </code> | + | </code> |
| + | Протестируйте и обновите конфигурацию | ||
| <code> | <code> | ||
| - | dns# sudo -u bind nano /var/lib/bind/_acme-challenge.anysiteN.yourdomain.ru | + | dns# named-checkconf -z |
| - | + | ||
| - | $TTL 30 | + | |
| - | _acme-challenge.anysiteN.yourdomain.ru. IN SOA ns.yourdomain.ru. noc.yourdomain.ru. 1 1d 12h 1w 30 | + | |
| - | NS ns.yourdomain.ru. | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | dns# named-checkconf -z | less | + | |
| dns# rndc reload | dns# rndc reload | ||
| + | </code> | ||
| - | dns# nsupdate -k /etc/bind/certbot.anysiteN.key | + | Для первого сайта стоит провести [[https://habr.com/ru/articles/925358/|Проверки работоспособности]] |
| - | > server 127.0.01 | + | |
| - | dns# less /etc/bind/certbot.anysiteN.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.anysiteN.key user@anysiteN: | + | <code> |
| - | + | dns# less /etc/bind/certbot.anysiteN.key | |
| - | user@anysiteN:~$ nsupdate -k certbot.anysiteN.key | + | </code> |
| - | > server <IP адрес dns сервера> | + | |
| + | и "подставляем" в инструкцию для администратора сайта | ||
| - | > zone _acme-challenge.anysiteN.yourdomain.ru | + | Инструкция для администратора сайта: |
| - | > update add _acme-challenge.anysiteN.yourdomain.ru. 30 IN TXT "test_txt_record 1" | + | |
| - | > send | + | |
| - | > update del _acme-challenge.anysiteN.yourdomain.ru. 30 IN TXT "test_txt_record 1" | + | |
| - | > send | + | |
| - | > quit | + | |
| - | + | ||
| - | # any-any-site# nslookup -q=TXT _acme-challenge.anysiteN.yourdomain.ru | + | |
| - | # any-any-site# host -t TXT _acme-challenge.anysiteN.yourdomain.ru | + | |
| - | # any-any-site# dig TXT _acme-challenge.anysiteN.yourdomain.ru | + | |
| - | + | ||
| - | ==== | + | |
| - | Что необходимо сделать: | + | |
| - | + | ||
| - | 1. Установить плагин certbot-dns, в debian/ubuntu делается так: | + | |
| + | 1. Установите плагин certbot-dns, в debian/ubuntu делается так: | ||
| + | <code> | ||
| anysiteN# apt install python3-certbot-dns-rfc2136 | anysiteN# apt install python3-certbot-dns-rfc2136 | ||
| - | + | </code> | |
| - | 2. Создать файл конфигурации с таким содержимым: | + | 2. Создайте файл конфигурации с таким содержимым: |
| + | <code> | ||
| anysiteN# cat /etc/certbot-credentials.ini | anysiteN# cat /etc/certbot-credentials.ini | ||
| - | dns_rfc2136_server = 195.19.32.2 | + | dns_rfc2136_server = 172.19.32.2 |
| dns_rfc2136_port = 53 | dns_rfc2136_port = 53 | ||
| dns_rfc2136_name = certbot.anysiteN | 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> | ||
| anysiteN# chmod 640 /etc/certbot-credentials.ini | anysiteN# chmod 640 /etc/certbot-credentials.ini | ||
| - | + | </code> | |
| - | 4. Запросить сертификаты и убедиться в их создании | + | 4. Запросите сертификаты и убедитесь в их создании |
| + | <code> | ||
| anysiteN# certbot certonly --dns-rfc2136 --dns-rfc2136-credentials /etc/certbot-credentials.ini -d 'anysiteN.yourdomain.ru' -d '*.anysiteN.yourdomain.ru' | anysiteN# certbot certonly --dns-rfc2136 --dns-rfc2136-credentials /etc/certbot-credentials.ini -d 'anysiteN.yourdomain.ru' -d '*.anysiteN.yourdomain.ru' | ||
| ... | ... | ||
| Line 112: | Line 112: | ||
| Your key file has been saved at: | Your key file has been saved at: | ||
| /etc/letsencrypt/live/anysiteN.yourdomain.ru/privkey.pem | /etc/letsencrypt/live/anysiteN.yourdomain.ru/privkey.pem | ||
| - | + | </code> | |
| - | 5. Для автоматического продления убедиться в создании файла конфигурации и, наличии таймеров и сервисов | + | 6. Для автоматического продления убедитесь в создании файла конфигурации и наличии таймеров и сервисов |
| + | <code> | ||
| anysiteN:~# cat /etc/letsencrypt/renewal/anysiteN.yourdomain.ru.conf | anysiteN:~# cat /etc/letsencrypt/renewal/anysiteN.yourdomain.ru.conf | ||
| Line 126: | Line 126: | ||
| 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.anysiteN | ||
| - | ... | ||
| - | Nov 26 14:06:37 ns named[213146]: client @0x7f4711f3f898 195.19.32.16#60008/key certbot.anysiteN: view yourdomainnet: updating zone '_acme-challenge.anysiteN.yourdomain.ru/IN': adding an RR at '_acme-challenge.anysiteN.yourdomain.ru' TXT "7VqXPt5zZ36jRFe9A61om1OALWFloaI2Rz7_OGtFYpM" | ||
| - | Nov 26 14:06:37 ns named[213146]: client @0x7f471200dc98 195.19.32.16#60020/key certbot.anysiteN: view yourdomainnet: updating zone '_acme-challenge.anysiteN.yourdomain.ru/IN': adding an RR at '_acme-challenge.anysiteN.yourdomain.ru' TXT "O67R1nFhhli0YaMQ2j-AtefRO0wr7mUwICbtzGnR_64" | ||
| - | Nov 26 14:07:43 ns named[213146]: client @0x7f4711ab5498 195.19.32.16#36166/key certbot.anysiteN: view yourdomainnet: updating zone '_acme-challenge.anysiteN.yourdomain.ru/IN': deleting an RR at _acme-challenge.anysiteN.yourdomain.ru TXT | ||
| - | Nov 26 14:07:43 ns named[213146]: client @0x7f4711f38898 195.19.32.16#36180/key certbot.anysiteN: view yourdomainnet: updating zone '_acme-challenge.anysiteN.yourdomain.ru/IN': deleting an RR at _acme-challenge.anysiteN.yourdomain.ru TXT | ||
| - | ... | ||
| - | </code> | ||