+7 495 230 03 03 8 800 222 50 03
DevOps

Использование DNS challenge для выпуска SSL-сертификатов Lets Encrypt

Бесплатные сертификаты Lets Encrypt сейчас используются повсеместно. Для того, чтобы подтвердить владение доменом и выпустить новый сертификат, требуется открыть наружу порт HTTP 80, что не всегда возможно и удобно, как с позиции безопасности, так и возможного конфликта с другими сервисами.

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

Мы будем использовать DNS-сервер BIND, установленный на ОС Debian. В вашем случае приведенные команды могут немного отличаться.

DNS-01 challenge использует добавление TXT-записей в DNS-зоне для подтверждения владения доменом. При запросе сервер ACME выдает вам уникальное значение, которые вы должны внести в виде TXT-записи. Пример подобной записи:

_acme-challenge.example.com. 300 IN TXT "wen43jkcchaow12334...3kahgm8e473"

Итак, проведем конфигурацию нашего DNS-сервера. В первую очередь, нам требуется создать ключ для подписи (TSIG key). Этот ключ используется для внесения изменения в зону:

root@dns ~ # dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST certbot
Kletsencrypt.+165+15583
root@dns ~ #

Подпись данного ключа необходимо добавить в конфигурационный файл BIND named.conf:

key "certbot" {
  algorithm hmac-sha512;
  secret "Q+NqA3DJR5ü77nQ6r//+5QyPKeOyxPD==n09qb516>CTqX+BoG1BeR/9BIEº2 ff4RrDKky4jJ3FJWnQD3nqiJ

Затем, вносим разрешение использования данного ключа для нашей DNS-зоны в этом же конфигурационном файле:

zone "example.com" in {
        type                    master;
        file                    "/etc/bind/db.example.com";
        allow-transfer          { 11.22.33.44; };
        allow-query             { any; };
        also-notify             { 11.22.33.44; };
        update-policy           {
            grant certbot  name _acme-challenge.example.com. txt;
            grant certbot  name _acme-challenge.www.example.com. txt;
            grant certbot  name _acme-challenge.mail.example.com. txt;
        };
};

Теперь нам необходимо настроить конфигурацию для получения сертификата на клиентской стороне. Для этого будем использовать RFC1236-плагин. Создаем конфигурационный файл rfc2136.ini с указанием TSIG key, созданного до этого и указанием IP вашего DNS-сервера:

dns_rfc2136_server = 1.2.3.4
dns_rfc2136_name = certbot
dns_rfc2136_secret = Q+NqA3DJR5ü77nQ6r//+5QyPKeOyxPD==n09qb516>CTqX+BoG1BeR/9BIEº2 ff4RrDKky4jJ3FJWnQD3nqiJ

Все готово. Далее выполняем тестовый запуск проверки получения сертификата. В случае использования Windows порядок действий аналогичный:

root@dns ~ # certbot renew --dry-run --dns-rfc2136 --dns-rfc2136-credentials /root/rfc2136.ini --server https://acme-v02.api.letsencrypt.org/directory --dns-rfc2136-propagation-seconds 5
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /usr/local/etc/letsencrypt/renewal/host.example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator dns-rfc2136, Installer None
Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for host.example.com
Waiting 5 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/usr/local/etc/letsencrypt/live/host.example.com/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /usr/local/etc/letsencrypt/live/host.example.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
root@dns ~ #


При этом в логах BIND можно увидеть записи о создании и удалении TXT-записей:

19-Aug-2023 17:54:52.249 update: info: client @0x8031d8a00 127.0.0.1#34120/key letsencrypt: updating zone 'example.com/IN': adding an RR at '_acme-challenge.host.example.com' TXT "QE6ow9YttB580nKw5jgRTOo(nDû3e3I_Ñ2-)j-rY951"
19-Aug-2023 17:54:52.259 notify: info: zone example.com/IN: sending notifies (serial 2018061426)
19-Aug-2023 17:55:00.787 update: info: client @0x804011000 127.0.0.1#34121/key letsencrypt: updating zone 'example.com/IN': deleting an RR at _acme-challenge.host.example.com TXT
19-Aug-2023 17:55:00.810 notify: info: zone example.com/IN: sending notifies (serial 2018061427)

Таким образом, мы успешно настроили выпуск SSL-сертификата при помощи DNS-плагина.

Нужна помощь? Администрирование DNS-серверов мы осуществляем в рамках услуги администрирование серверов.

Дата публикации: 31 августа 2023
Не нашли ответа на свой вопрос?

Смотрите также

Обсуждение материала

Содержание

Заказать звонок

Оставьте свои данные для того, чтобы специалист с вами связался.

*нажимая на кнопку, Вы даете согласие на обработку персональных данных
Быстрое внедрение включает:
На сервере установлено следующее ПО (доступно при подключении по протоколу RDP):
Также настроено:
Перед внедрением клиент предоставляет информацию о пользователях (логины и пароли). После завершения работ, клиенту высылается инструкция и ярлык для подключения.
Индивидуальное внедрение по ТЗ клиента обсуждается отдельно.