Как проверить txt запись acme challenge в dns

Обновлено: 05.07.2024

Как мне ./letsencrypt-auto сгенерировать новый сертификат, используя проверку DNS-домена?

Примечание: Certbot (это новое имя для клиента letsencrypt) теперь разрешает аутентификацию на основе webroot по умолчанию.

В настоящее время можно выполнить проверку DNS также с помощью клиента certbot LetsEncrypt в ручном режиме. Автоматизация также возможна (см. Ниже).

Ручной плагин

Вы можете выполнить ручную проверку - с помощью ручного плагина.

Certbot предоставит вам инструкции по обновлению записи TXT для домена вручную, чтобы продолжить проверку.

После того, как вы обновили запись DNS, нажмите Enter, certbot продолжит работу, и если LetsEncrypt CA подтвердит вызов, сертификат будет выдан как обычно.

Вы также можете использовать команду с большим количеством опций, чтобы минимизировать интерактивность и отвечать на вопросы certbot. Обратите внимание, что ручной плагин еще не поддерживает неинтерактивный режим.

Обновление не работает с ручным плагином, так как он работает в неинтерактивном режиме. Больше информации в официальной документации Certbot .

Обновление: ручные крючки

В новой версии Certbot вы можете использовать крючки , например --manual-auth-hook , --manual-cleanup-hook . Хуки - это внешние скрипты, выполняемые Certbot для выполнения задачи.

Информация передается в переменных среды - например, домен для проверки, токен запроса. Варс: CERTBOT_DOMAIN , CERTBOT_VALIDATION , CERTBOT_TOKEN .

Вы можете написать свой собственный обработчик или использовать уже существующий, есть много доступных, например, для Cloudflare DNS.

Более подробная информация об официальной документации Certbot Hooks

Автоматизация, Обновление, Сценарии

Если вы хотите автоматизировать проверку проблем DNS, в настоящее время это невозможно с vanila certbot. Обновление: некоторая автоматизация возможна с крючками Certbot.

Таким образом, мы создали простой плагин, который поддерживает скрипты с автоматизацией DNS. Это доступно как certbot-external-auth .

Режим обработчика

В режиме обработчика плагин certbot + вызывает внешние хуки (программу, скрипт оболочки, python, . ) для проверки и установки. На практике вы пишете простой скрипт обработчика / оболочки, который получает входные аргументы - домен, токен и вносит изменения в DNS. Когда обработчик завершает работу, certbot продолжает проверку как обычно.

Это дает вам дополнительную гибкость, обновление также возможно.

Режим Обработчик также совместим с обезвоженных крючками DNS (бывший letsencrypt.sh). Уже есть много хуков DNS для обычных провайдеров (например, CloudFlare, GoDaddy, AWS). В репозитории есть README с обширными примерами и примерами обработчиков.

Пример с перехваченным DNS-крючком:

Режим JSON

Другой режим плагина - это режим JSON. Он производит один объект JSON на строку. Это позволяет более сложную интеграцию - например, Ansible или какой-либо менеджер развертывания вызывает certbot. Связь осуществляется через STDOUT и STDIN. Cerbot создает объект JSON с данными для проверки, например:

После обновления DNS вызывающий абонент отправляет символ новой строки в STDIN сервера certbot, чтобы сообщить, что он может продолжить проверку.

Это позволяет автоматизировать и управлять сертификатами с центрального сервера управления. Для установки вы можете развернуть сертификаты через SSH.

Для получения дополнительной информации обратитесь к readme и примерам на certbot-external-auth GitHub.

РЕДАКТИРОВАТЬ: в настоящее время мы работаем над Ansible двухэтапной проверки, скоро будет выключен.

  • Упрощённая автоматизация процесса, не требующая дополнительных знаний по настройке доменов
  • Выпуск сертификатов для доменов хостинг-провайдеров, привязанных по CNAME.
  • Совместим с уже настроенными web-серверами.
  • Требует открытого порта 80 (редко, но интернет-провайдеры блокируют этот адрес)
  • Let’s Encrypt не разрешает использовать эту проверку для сертификатов с подстановкой (wildcard-сертификатов).
  • Для каждого web-сервера требуется свой файл.

Крайне важно автоматизировать процессы выпуска и отзыва сертификатов, поэтому проверку DNS-01 имеет смысл использовать, когда DNS-провайдер предоставляет API для автоматических обновлений. Наше сообщество поддерживает список таких DNS-провайдеров. DNS-провайдер может быть либо регистратором доменов (компанией, у которой вы купили доменное имя), либо сторонней организацией. Если вы захотите сменить DNS-провайдера, нужно будет сделать незначительные изменения у регистратора доменов. Ожидать окончания срока действия сертификатов при этом не требуется.

Обратите внимание, что размещение полноправной учётной записи для DNS API на web-сервере увеличивает возможный ущерб при взломе. Лучше использовать учётную запись с ограниченными возможностями, или выполнять проверку DNS-01 на отдельном сервере, с последующим копированием сертификатов на web-сервер.

Let’s Encrypt придерживается стандартов DNS для поиска TXT-записи при проверке DNS-01, поэтому можно задействовать записи CNAME или NS для делегирования права ответа за другие DNS-зоны. Например настроив субдомен _acme-challenge для специального сервера валидации. Или, если DNS-провайдер медленно обновляется, и вы хотите использовать более производительный сервер.

Для большинства DNS-провайдеров характерен “период обновления данных”, показывающий, сколько времени пройдёт с момента изменения DNS-записи до обновления всех DNS-серверов провайдера. Этот период сложно оценить, особенно когда DNS-провайдеры применяют anycast. В этом случае, в зависимости от геолокации, вы и Let’s Encrypt будете взаимодействовать с разными серверами, и получать различные результаты. Продуманные DNS API содержат методы автоматического уведомления о полном обновлении записей на всех серверах провайдера. Если DNS-провайдер такой информации не даёт, придётся настроить ACME-клиент на длительное (не менее часа) ожидание перед запуском валидации.

Для одного и того же доменного имени допускается несколько TXT-записей. Например, когда требуется одновременно выполнить проверку и для обычного сертификата, и для wildcard-сертификата. Удаляйте неактуальные TXT-записи, т.к. из-за большого размера ответа сервера при проверке
Let’s Encrypt признает проверку неудачной.

  • Подходит для сертификатов с подстановкой (wildcard-сертификатов).
  • Одна запись для нескольких web-серверов.
  • У DNS-провайдера может не быть своего API.
  • Хранение учётной записи для DNS API небезопасно.
  • DNS API может не быть методов оценки период обновления записей.

Проверка была описана в черновиках протокола ACME. Согласно ей, вначале выполняется TLS handshake на порте 443, и посылается специальный SNI заголовок для поиска сертификата, содержашего токен. Проверка TLS-SNI-01 отключена в марте 2019 по причине недостаточной безопасности.

Разработана после признания проверки TLS-SNI-01 устаревшей, как отдельный стандарт. Как и TLS-SNI-01, проверка TLS-ALPN-01 выполняется через TLS handshake на порте 443. Но в данном случае применяется специальный протокол ALPN, чтобы на запросы валидации отвечали только серверы, знающие о таком типе проверки. Кроме того, становится возможным использовать SNI-поле, совпадающее с именем домена, для которого проводится валидация, для увеличения надёжности проверки.

  • Будет работать даже если порт 80 закрыт.
  • Реализована целиком внутри слоя TLS

Let's Encrypt - это бесплатный, автоматизированный и открытый Центр Сертификации, созданный для вас некоммерческой организацией Internet Security Research Group (ISRG).

Процесс в данной статье описан на примере систем Linux CentOS, Ubuntu (Debian) и Windows. Настройка выполняется в несколько шагов.

Проверка домена

Настройка веб-сервера

Данный способ немного сложнее для Linux (для Windows все настройки делает утилита автоматически), но позволяет без проблем настроить автоматическое продление.

Linux NGINX

Пример простого конфигурационного файла для NGINX:

Если сервер уже используется для сайта, в секцию server добавляем:

/.well-known root /usr/share/nginx/html;
allow all;
>

* данными строчками мы говорим, что для всех запросов после /.well-known необходимо отдавать скрипты из каталога /usr/share/nginx/html; allow all предоставляет доступ всем.

При необходимости выполнять проверку и использовать rewrite/return, добавляем что-то подобное:

/.well-known root /usr/share/nginx/html;
allow all;
>
if ($uri !

После проверяем конфигурацию и перезапускаем nginx:

service nginx reload

Linux Apache

Создаем общий конфигурационный файл, в котором пропишем алиас.

б) для Ubuntu / Debian:

Со следующим содержимым:

Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/

* в данном примере, запросы для страниц /.well-known/acme-challenge всех сайтов мы переводим в каталог /var/www/html/.well-known/acme-challenge.

Проверяем корректность конфигурационного файла:

И перезапускаем apache:

Windows

Выбираем сайт в консоли IIS

В меню справа кликаем по Привязки:

Переходим к настройкам привязок сайта

Изменяем привязку для имеющийся записи и, при необходимости, добавляем еще:

Настраиваем привязки сайта

Применяем настройки и закрываем консоль управления IIS.

С помощью записи в DNS

Данный метод проще, описанного выше, но он позволит настроить автоматическое продление сертификата только для некоторых DNS, для которых есть отдельные certbot-плагины. Поэтому данный способ, в большинстве случаев, будет удобен для проведения тестов.

У нас должна быть возможность управления записями в DNS. На данном этапе достаточно просто зайти в панель управления DNS и перейти к этапу получения сертификата (ниже по тексту). Если домен новый и был только-что делегирован на DNS, возможно, придется подождать, пока он не станет доступен для всех серверов DNS в глобальной сети.

Установка утилиты для получения сертификата

Certbot для Linux

а) на CentOS 8:

dnf --enablerepo=PowerTools install certbot

б) на CentOS 7:

yum install certbot

в) на Ubuntu 16.04 и выше, а также Debian:

apt-get install certbot

г) на CentOS 6 или Ubuntu 14.04 / 12.04:

Создадим каталог, в котором будет храниться утилита и переходим в него:

Загружаем утилиту и разрешаем ее запуск:

chmod a+x ./letsencrypt-auto

Для удобства, делаем симлинк:

ln -s /opt/certbot/letsencrypt-auto /usr/local/sbin/certbot

При первом запуске certbot он автоматически предложит доустановить необходимые зависимости — соглашаемся.

LetsEncrypt-Win-Simple для Windows

На сайте GitHub скачиваем win-acme pluggable для нужной разрядности операционной системы:

Скачиваем win-acme pluggable для Windows x32 или x64

Раcпаковываем скачанный архив в любую папку.

Первое получение сертификата

Linux

1. Если мы подтверждаем право на домен при помощи веб-сервера, выполняем команду с таким синтаксисом:

certbot certonly --webroot --agree-tos --email <почта администратора домена> --webroot-path <путь до каталога с файлами проверки> -d <домен 1> -d <домен 2> -d .

  • certonly — запрос нового сертификата;
  • webroot — проверка будет выполняться на основе запроса к корню сайта;
  • agree-tos — даем согласие на лицензионное соглашение;
  • email — почтовый адрес администратора домена;
  • webroot-path — каталог в системе Linux, который является корневым для сайта;
  • d — перечисление доменов, для которых запрашиваем сертификат.

а) Пример запроса при использовании веб-сервера NGINX:

б) Пример запроса при использовании веб-сервера Apache:

2. При подтверждении права на домен с TXT-записью:

  • certonly — запрос нового сертификата;
  • manual — проверка домена вручную.
  • preferred-challenges — указывает метод проверки домена.
  • agree-tos — даем согласие на лицензионное соглашение;
  • email — почтовый адрес администратора домена;
  • d — перечисление доменов, для которых запрашиваем сертификат.

На запрос подтверждения отвечаем Y — система выдаст что-то на подобие:

Once this is deployed,

Создаем соответствующую запись в панели управления DNS, и в консоли сервера нажимаем Enter для продолжения. Если, как в данном примере, мы запрашиваем сертификат для нескольких узлов, повторяем действия.

Windows

Открываем командную строку от администратора и переходим в распакованный каталог. Например, если архив распакован на диск C, выполняем:

* где 2.1.6.773.x64 — моя версия утилиты.

Откроется меню с выбором действия — вводим N, чтобы создать новый сертификат:

Начальная меню win-acme

Выбираем сайт в IIS, который отвечает на запросы нашего домена (в нашем случае, это единственный Default Web Site, то есть 1):

Выбираем сайт для которого хотим получить сертификат

Если для сайта создано несколько привязок, выбираем 3, чтобы создать сертификаты для всех:

Выбираем все привязки

Вводим email адрес и подтверждаем корректность данных:

Вводим почтовый адрес для уведомлений

Утилита создаст необходимый каталог для проверки домена, запросит проверку, получит сертификат, добавит привязку к сайту по 443 порту с добавлением полученного сертификата и создаст в планировщике задание на автоматическое продление сертификата.

Автоматическое продление

Linux

Смотрим полный путь до скрипта certbot:

Открываем на редактирование cron и добавляем следующее:

а) для Ubuntu / Debian:

0 0 * * 1,4 /usr/bin/certbot renew

0 0 * * 1,4 /bin/certbot renew

* в данном примере проверка и продление сертификата будет выполняться по понедельникам и четвергам (1,4) в 00:00. /usr/bin/certbot или /bin/certbot — путь, который мне выдала команда which certbot.

Команда certbot renew проверяет для всех наших сертификатов срок окончания, и если осталось менее 30 дней, запрашивает новый, сохраняет его в каталоге /etc/letsencrypt/archive/<домен> и обновляет симлинк.

Стоит иметь ввиду, что многие приложения, использующие сертификат, потребуют перезапуска, чтобы перечитать его. Поэтому хорошей идеей будет не просто обновлять сертификат, но и перезапускать сервис, который использует сертификат. Например, для NGINX:

0 0 * * 1,4 /bin/certbot renew && systemctl reload nginx

Windows

Настройка задания на автоматическое продление создается при получении сертификата. Проверить задание можно в планировщике заданий Windows:

Задание в планировщике Windows для автоматического продления сертификата

Wildcard

Certbot

Необходимо, чтобы версия утилиты certbot была 0.22.0 и выше. Проверить текущую версию можно командой:

. если версия ниже, обновляем ее командами:

а) для CentOS / Red Hat:

yum update certbot

б) для Ubuntu / Debian:

apt-get install --only-upgrade certbot

Процесс получения

Процесс очень похож на процесс получения сертификата с подтверждением домена в DNS.

. система попросит создать TXT-запись в DNS, который обслуживает наш домен:

Заходим в панель управления DNS и создаем нужную запись. Если у нас свой сервер DNS, например, bind, то строка будет такой:

; TXT
_acme-challenge IN TXT DN8ovKFJ0leLQV9ofZ81mYKxojwIaed5g6f0bXZCYiI

Не торопимся нажимать Enter — после настройки DNS нужно немного времени (пару минут), чтобы настройка применилась. Проверить появление записи можно командой с рабочего компьютера:

Как только видим, что настройки применились, нажимаем Enter — если это наш первый запрос Wildcard для данного домена, то система нас попросит создать еще одну запись — повторяем процедуру, создав в DNS вторую запись TXT.

Если все сделали правильно, то увидим:

Возможные ошибки

Рассмотрим некоторые ошибки, с которыми мы можем столкнуться.

Missing command line flag or config entry for this setting

Ошибка появляется при попытке обновить сертификат для одного или нескольких доменов.

Причина: при обновлении сертификата, утилита certbot ищет настройки в конфигурационном файле /etc/letsencrypt/renewal/<имя домена>.conf. Если в данном файле не будет определена конфигурация для webroot_map, мы получим данную ошибку.

Решение:

Открываем конфигурационный файл для домена, например:

Находим опцию webroot_map (как правило, в самом низу). Либо она будет пустой, либо указывать на неправильный путь. Исправляем это:

* мы указываем домен и каталог, в котором будет создаваться проверочный файл.

Пробуем обновить сертификат.

ACMEv1 is deprecated and you can no longer get certificates from this endpoint

Ошибка появляется при попытке запросить или обновить сертификат. Полный текст ошибки:

Причина: утилита на компьютере устарела. Она пытается использовать API-портал ACMEv1, который больше не поддерживается.

Сертификаты Let’s Encrypt® действительны в течение 90 дней с момента выпуска. Для выпуска сертификата нужно подтвердить право на доменное имя — пройти проверку. Каждые 60 дней сертификаты нужно обновлять и также проходить проверку.

Если ваше доменное имя делегировано на NS-серверы Selectel (Selectel является вашим DNS-провайдером), вы можете подтвердить право на домен с помощью услуги DNS-хостинг. Selectel предоставляет API управления DNS-записями, которое можно использовать для автоматизации перевыпуска сертификатов.

Как работает проверка домена через DNS-01

Проверка DNS-01 требует подтверждения права на домен с помощью специальной TXT-записи для доменного имени. Проверка DNS-01 разрешает выпускать Wildcard-сертификаты.

Со стороны Let’s Encrypt® передаётся токен ACME-клиенту. ACME-клиент создаёт содержимое TXT-записи на основе токена и ключа аккаунта вида:

Затем Let’s Encrypt запрашивает TXT-запись в DNS-зоне доменного имени. Если запись добавлена, и значения совпадут — сертификат будет выпущен.

Обратите внимание! Скрипты следует запускать не реже, чем раз в 90 дней, предпочтительнее — раз в 60 дней.

Можно также выполнить ручной выпуск и обновление сертификата — при этом будет требоваться ручной ввод TXT-записи в панели управления. Примечание: предпочтительнее использовать DNS API.

Автоматический выпуск сертификата с помощью acme.sh

Чтобы автоматически выпустить сертификат с помощью acme.sh:

Передайте ключ API в переменную SL_Key :

Значение SL_Key будет сохранено в папке

Автоматический выпуск сертификата с помощью lego

Чтобы автоматически выпустить сертификат с помощью lego:

Передайте ключ API в переменную SELECTEL_API_TOKEN :

Автоматический выпуск сертификата с помощью dehydrated

Чтобы автоматически выпустить сертификат с помощью dehydrated:

Передайте ключ API в переменную SELECTEL_TOKEN :

Выпустите сертификат, запустив скрипт hook.sh.

Ручной выпуск сертификата с помощью acme.sh

При ручном выпуске сертификата нужно добавить TXT-запись в панели управления. При обновлении сертификата запись также нужно обновлять вручную.

Добавьте TXT-запись в панели управления. Этот шаг обязателен каждый раз, когда вы обновляете сертификат.

Подождите около минуты, чтобы записи DNS обновились. Затем введите команду:

Читайте также: