Используя Lego, я создал провайдер, который работает как DNS-сервер и выполняет аутентификацию DNS-01 для получения SSL-сертификатов Let’s Encrypt.
Введение
Lego — это клиент ACME, написанный на Go, который служит инструментом командной строки для получения SSL-сертификатов, таких как Let’s Encrypt.
Что я сделал?
Аутентификация DNS-01 в Lego поддерживает множество DNS-провайдеров, но для тех случаев, когда «нет DNS-сервера с доступным API», я создал провайдер selfdns, который использует сам Lego как DNS-сервер для выдачи SSL-сертификатов с помощью аутентификации DNS-01.
Разумно предположить, что использование самого Lego в качестве сервера, вероятно, не рассматривалось в оригинальной версии, поэтому я решил не отправлять запрос на слияние, а просто создать личный форк без написания тестового кода.
С помощью этого провайдера можно получать SSL-сертификаты с использованием аутентификации DNS-01 даже для DNS-сервисов, которые не поддерживают API (например, DNS, придаваемый домену).
Поскольку Lego будет работать как DNS-сервер, необходимо обеспечить доступ к нему извне.
Отказ от ответственности
Я создал это в основном для личного использования, поэтому не могу гарантировать работоспособность.
Кроме того, я не проверял спецификации ACME и создавал это просто с пониманием «если работает, то хорошо».
Инструкция по использованию
Укажите NS-запись для DNS, к которому хотите обратиться
Я хочу выдать сертификат на VPS-сервере (hoge), поэтому указываю NS-запись для DNS сервера hoge.
hoge 60 IN A XXX.XXX.XXX.XXX _acme-challenge 60 IN NS hoge.example.jp.
Для проверки правильности настроек выполните команду dig.
$ dig _acme-challenge.example.jp -t ns ;; AUTHORITY SECTION: _acme-challenge.example.jp. 60 IN NS hoge.example.jp. ;; ADDITIONAL SECTION: hoge.example.jp. 60 IN A XXX.XXX.XXX.XXX
Подготовьте сервер с глобальным IP, на котором будет выполняться lego
Откройте порты в iptables. Для работы как DNS-сервер необходимо открыть UDP/TCP порт 53.
# iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT # iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
Скачайте модифицированную версию Lego.
# wget https://github.com/masa23/lego/releases/download/v4.10.0/lego_v4.10.0-1_linux_amd64.tar.gz # tar zxvf lego_v4.10.0_linux_amd64.tar.gz
Выполните lego для получения сертификата.
Чтобы он работал как DNS-сервер, укажите--dns selfdns
.
Необходимо выполнение с правами root, так как используется порт 53.# SELFDNS_LISTEN_ADDRESS=XXX.XXX.XXX.XXX SELFDNS_SERVER_HOSTNAME=hoge.example.jp ./lego --email <Электронная почта> --domains="*.example.jp" --accept-tos --dns=selfdns run
В
SELFDNS_LISTEN_ADDRESS
указывайте глобальный IP адрес сервера, на котором выполняется lego. ВSELFDNS_SERVER_HOSTNAME
указывайте имя хоста сервера.
Оно будет использовано в SOA-записи при ответе.
Если все прошло гладко, сертификат будет выдан.
.lego/certificates/
Дополнение (2023/02/17)
Теперь, если указать IPv6 адрес в SELFDNS_LISTEN_ADDRESS
, то DNS-сервер будет запускаться с помощью IPv6 адреса. Таким образом, теперь можно получать SSL-сертификаты Let’s Encrypt с помощью глобального IPv6 адреса.
- Регистрация DNS
hoge 60 IN AAAA 20XX:XX:... _acme-challenge 60 IN NS hoge.example.jp.
- Выполнение lego
# SELFDNS_LISTEN_ADDRESS=20XX:XX:... SELFDNS_SERVER_HOSTNAME=hoge.example.jp ./lego --email <Электронная почта> --domains="*.example.jp" --accept-tos --dns=selfdns run
Теперь вы можете легко получить SSL-сертификаты Let’s Encrypt даже без ценного глобального IPv4 адреса! Я смог получить сертификат с домашнего IPv6 адреса от Flet’s. Это очень удобно.