Бесплатные сертификаты 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-серверов мы осуществляем в рамках услуги администрирование серверов.