Создание провайдера Lego selfdns
Сервер
Lastmod: 2023-02-17
Published: 2023-02-16

Используя 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. Это очень удобно.