He creado un proveedor de selfdns con Lego
Servidor
Lastmod: 2023-02-17
Published: 2023-02-16

Usando Lego, he creado un proveedor que actúa como un servidor DNS para realizar la autenticación DNS-01 al obtener un certificado SSL de Let’s Encrypt.

Introducción

Lego es una herramienta de línea de comandos escrita en Go que actúa como cliente ACME para obtener certificados SSL de Let’s Encrypt y otros.

¿Qué hice?

La autenticación DNS-01 de Lego es compatible con varios proveedores de DNS, pero en caso de que no haya un servidor DNS que soporte API, creé un proveedor selfdns que se ejecuta como un servidor DNS y permite emitir certificados SSL a través de la autenticación DNS-01.

Es probable que no se prevea que Lego se ejecute como un servidor en su versión original, por lo que no planeo hacer un Pull Request. En lugar de eso, he creado una versión personal y no he escrito código de prueba para ella.

Con esto, incluso los servicios DNS que no tienen API (como el DNS asociado a un dominio) pueden obtener certificados SSL mediante la autenticación DNS-01 al apuntar a los registros NS.

Dado que Lego se ejecutará como servidor DNS, es necesario habilitar el acceso para que pueda ser alcanzado desde el exterior.

Descargo de responsabilidad

Este proyecto se ha creado solo con fines personales, por lo que no hay garantías de funcionamiento.
Además, no revisé las especificaciones de ACME y lo hice simplemente para que funcione.

Cómo usarlo

Apuntar los registros NS al DNS deseado

  • Quiero emitir un certificado en un servidor VPS (hoge), así que apunto los registros NS en el DNS del servidor hoge.

    hoge            60  IN A  XXX.XXX.XXX.XXX
    _acme-challenge 60  IN NS hoge.example.jp.
    
  • Para verificar que se han establecido correctamente los registros, utilizo el comando 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
    

Preparar un servidor con IP global para ejecutar lego

  • Abro los puertos en iptables. Para que funcione como servidor DNS, es necesario abrir los puertos 53 UDP/TCP.

    # iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
    # iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
    
  • Descargo la versión modificada de 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
    
  • Ejecuto lego para emitir el certificado.
    Para funcionar como servidor DNS, especifico --dns selfdns.
    Se necesitan privilegios de root para usar el puerto 53.

    # SELFDNS_LISTEN_ADDRESS=XXX.XXX.XXX.XXX SELFDNS_SERVER_HOSTNAME=hoge.example.jp ./lego --email <correo electrónico> --domains="*.example.jp" --accept-tos --dns=selfdns run 
    

    Aquí, SELFDNS_LISTEN_ADDRESS debe establecerse en la IP global del servidor donde se ejecuta lego. SELFDNS_SERVER_HOSTNAME debe ser el nombre de host del servidor donde se ejecuta lego.
    Este nombre se usará en el registro SOA al responder.

Si todo está correcto, se emitirá el certificado.

.lego/certificates/

Actualización (2023/02/17)

Ahora, al especificar una dirección IPv6 en SELFDNS_LISTEN_ADDRESS, el servidor DNS se iniciará con la dirección IPv6.
Con esto, ahora es posible obtener un certificado SSL de Let’s Encrypt si se tiene una dirección IP global IPv6.

  • Registro DNS
    hoge            60  IN AAAA  20XX:XX:...
    _acme-challenge 60  IN NS hoge.example.jp.
    
  • Ejecución de lego
    # SELFDNS_LISTEN_ADDRESS=20XX:XX:... SELFDNS_SERVER_HOSTNAME=hoge.example.jp ./lego --email <correo electrónico> --domains="*.example.jp" --accept-tos --dns=selfdns run
    

¡Ahora es posible obtener certificados SSL de Let’s Encrypt sin necesidad de una dirección IP global IPv4 valiosa! Pude emitir un certificado con la dirección IPv6 de mi conexión a Internet en casa. ¡Demasiado conveniente!