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 15:15] 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 сервером | + | Инструкция для администратора DNS сервера: |
| + | |||
| + | Назначьте IP адрес для очередного внутреннего сайта и опишите зону, для будущей DNS-01 проверки с единственным DNS сервером (не забудьте увеличить номер версии зоны:) | ||
| <code> | <code> | ||
| dns# nano /etc/bind/yourdomain.ru | dns# nano /etc/bind/yourdomain.ru | ||
| 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 34: | Line 36: | ||
| </code> | </code> | ||
| - | Указываем местоположение файла зоны, и права на ее редактирование, для созданного ключа | + | Создайте минимальный файл зоны, в каталоге и, с правами, которые, в дальнейшем, позволят редактировать его через сервис named |
| + | <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# nano /etc/bind/named.conf.local | dns# nano /etc/bind/named.conf.local | ||
| 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> | + | |
| - | 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> | + | |
| - | + | ||
| - | Тестируем и обновляем конфигурацию | + | |
| <code> | <code> | ||
| dns# named-checkconf -z | dns# named-checkconf -z | ||
| Line 66: | Line 68: | ||
| Для первого сайта стоит провести [[https://habr.com/ru/articles/925358/|Проверки работоспособности]] | Для первого сайта стоит провести [[https://habr.com/ru/articles/925358/|Проверки работоспособности]] | ||
| - | Если все работает, "вспоминаем" имя и значение ключа | + | Процесс выпу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> | ||
| + | Если все работает, извлекаем имя и значение ключа из файла | ||
| <code> | <code> | ||
| Line 74: | Line 84: | ||
| и "подставляем" в инструкцию для администратора сайта | и "подставляем" в инструкцию для администратора сайта | ||
| - | Инструкция: | + | Инструкция для администратора сайта: |
| 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 = 172.19.32.2 | dns_rfc2136_server = 172.19.32.2 | ||
| Line 88: | Line 98: | ||
| 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 102: | 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> | |
| - | 6. Для автоматического продления убедитесь в создании файла конфигурации и, наличии таймеров и сервисов | + | 6. Для автоматического продления убедитесь в создании файла конфигурации и наличии таймеров и сервисов |
| + | <code> | ||
| anysiteN:~# cat /etc/letsencrypt/renewal/anysiteN.yourdomain.ru.conf | anysiteN:~# cat /etc/letsencrypt/renewal/anysiteN.yourdomain.ru.conf | ||
| Line 116: | 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 172.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 172.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 172.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 172.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> | ||