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!