Cómo Obtener un Certificado de Let’s Encrypt Usando Validación por DNS con acme-dns-certbot en Ubuntu 18.04

El autor eligió el Fondo de Ayuda para COVID-19 para recibir una donación como parte del programa Escribir por Donaciones.

Introducción

La mayoría de los certificados de Let’s Encrypt se emiten usando la validación HTTP, lo que permite la fácil instalación de certificados en un solo servidor. Sin embargo, la validación HTTP no siempre es adecuada para emitir certificados para uso en sitios web balanceados de carga, ni se puede usar para emitir certificados wildcard.

La validación DNS permite que las solicitudes de emisión de certificados se verifiquen utilizando registros DNS, en lugar de servir contenido mediante HTTP. Esto significa que se pueden emitir certificados simultáneamente para un cluster de servidores web que ejecutan atrás de un balanceador de carga, o para un sistema que no es directamente accesible a través de Internet. También se admiten certificados wildcard mediante validación DNS.

La herramienta acme-dns-certbot se utiliza para conectar Certbot a un servidor DNS de terceros donde los registros de validación del certificado se pueden configurar automáticamente a través de una API cuando solicitas un certificado. La ventaja de esto es que no necesitas integrar Certbot directamente con tu cuenta de proveedor de DNS, ni tampoco necesitas concederle acceso sin restricciones a tu configuración DNS completa, lo que resulta beneficioso para la seguridad.

Las zonas DNS delegadas se utilizan para redirigir las búsquedas de los registros de validación del certificado al servicio DNS de terceros, de modo que una vez completada la configuración inicial, puedes solicitar tantos certificados como quieras sin tener que realizar ninguna validación manual.

Otra ventaja clave de acme-dns-certbot es que se puede utilizar para emitir certificados para servidores individuales que puedan estar ejecutándose detrás de un balanceador de carga o que de otra manera no se pueden acceder directamente a través de HTTP. La validación de certificados HTTP tradicional no se puede utilizar en estos casos, a menos que configure los archivos de validación en cada servidor. La herramienta acme-dns-certbot también es útil si deseas emitir un certificado para un servidor que no es accesible a través de Internet, como un sistema interno o un entorno de pruebas.

En este tutorial, utilizarás el complemento de Certbot para acme-dns-certbot para emitir un certificado de Let’s Encrypt usando la validación por DNS.

Prerrequisitos

Para completar este tutorial, necesitarás:

  • Un servidor Ubuntu 18.04 configurado siguiendo la guía Configuración Inicial del Servidor con Ubuntu 18.04, incluyendo un usuario no root con sudo.

  • Un nombre de dominio para el que puedas obtener un certificado TLS, incluyendo la capacidad para agregar registros DNS. En este ejemplo particular, utilizaremos your-domain y subdomain.your-domain, así como *.your-domain para un certificado wildcard. Sin embargo, esto se puede ajustar para otro dominio, subdominios o wildcards si es necesario.

Una vez que tienes estos elementos listos, inicia sesión en tu servidor como usuario no root para comenzar.

Paso 1 — Instalar Certbot

En este paso, instalará Certbot, un programa utilizado para emitir y administrar certificados de Let’s Encrypt.

Certbot está disponible en los repositorios oficiales de Ubuntu Apt, sin embargo, se recomienda utilizar el repositorio mantenido por los desarrolladores de Certbot, ya que siempre contiene la versión más actualizada del software.

Comience agregando el repositorio de Certbot:

sudo apt-add-repository ppa:certbot/certbot

Necesitará presionar ENTER para aceptar el aviso y agregar el nuevo repositorio a su sistema.

Después, instale el paquete Certbot:

sudo apt install certbot

Una vez finalizada la instalación, puede verificar que Certbot ha sido instalado correctamente:

certbot --version

Esto mostrará algo similar a lo siguiente:

Output
certbot 0.31.0

En este paso ha instalado Certbot. A continuación, descargará y instalará el gancho acme-dns-certbot.

Paso 2 — Instalar acme-dns-certbot

Ahora que se ha instalado el programa básico de Certbot, puede descargar y instalar acme-dns-certbot, que permitirá a Certbot funcionar en modo de validación DNS.

Comience descargando una copia del script:

Nota: Como mejor práctica, asegúrese de revisar este repositorio de Github y el script antes de ejecutarlo. También puede crear un fork de este repositorio y luego utilizar el script acme-dns-certbot.py. Este fork aporta una capa adicional de seguridad, garantizando que el script permanezca bajo nuestro control y es menos propenso a cambios no verificados.

wget https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py

Una vez que la descarga haya finalizado, marque el script como ejecutable:

chmod +x acme-dns-auth.py

A continuación, edite el archivo con su editor de texto favorito y ajuste la primera línea para forzar el uso de Python 3:

nano acme-dns-auth.py

Agregue un 3 al final de la primera línea:

acme-dns-certbot.py
#!/usr/bin/env python3
. . .

Esto es necesario para asegurar que el script use la versión más reciente compatible de Python 3, en lugar de la versión antigua de Python 2.

Una vez completado, guarde y cierre el archivo.

Finalmente, mueva el script al directorio de Certbot Let’s Encrypt para que Certbot pueda cargarlo:

sudo mv acme-dns-auth.py /etc/letsencrypt/

En este paso, ha descargado e instalado el hook acme-dns-certbot. A continuación, puede comenzar el proceso de configuración y trabajar para emitir su primer certificado.

Paso 3 — Configuración de acme-dns-certbot

Para comenzar a usar acme-dns-certbot, necesitará completar un proceso de configuración inicial y emitir al menos un certificado.

Comience ejecutando Certbot para forzar que emita un certificado utilizando la validación DNS. Esto ejecutará el script acme-dns-certbot y disparará el proceso de configuración inicial:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain -d your-domain

Usa el argumento --manual para deshabilitar todas las características de integración automatizada de Certbot. En este caso, solo estás emitiendo un certificado en bruto, en lugar de instalarlo automáticamente en un servicio.

Configura Certbot para usar el complemento acme-dns-certbot mediante el argumento --manual-auth-hook. Ejecutas el argumento --preferred-challenges para que Certbot preste prioridad a la validación DNS.

También debes decir a Certbot que se pare antes de intentar validar el certificado, lo cual haces con el argumento --debug-challenges. Esto te permite establecer los registros DNS CNAME requeridos por acme-dns-certbot, lo cual se cubre más adelante en este paso. Sin el argumento --debug-challenges, Certbot no se detendría, así que no tendrías tiempo para hacer el cambio DNS requerido.

Recuerde sustituir cada uno de los nombres de dominio que desee utilizar usando los argumentos -d. Si desea emitir un certificado comodín, asegúrese de escape el asterisco (*) con una barra invertida (\).

Después de seguir las etapas estándar de Certbot, finalmente le aparecerá una notificación similar a la siguiente:

Output
... Output from acme-dns-auth.py: Please add the following CNAME record to your main DNS zone: _acme-challenge.your-domain CNAME a15ce5b2-f170-4c91-97bf-09a5764a88f6.auth.acme-dns.io. Waiting for verification... ...

Necesitará agregar el registro DNS CNAME requerido a la configuración DNS de su dominio. Esto delegará el control del subdominio _acme-challenge al servicio de DNS ACME, lo que permitirá a acme-dns-certbot establecer los registros DNS requeridos para validar la solicitud de certificado.

Si está utilizando DigitalOcean como su proveedor de DNS, puede configurar el registro DNS en su panel de control:

Se recomienda establecer el TTL (tiempo de vida) en alrededor de 300 segundos para ayudar a garantizar que cualquier cambio en el registro se propague rápidamente.

Una vez que haya configurado el registro DNS, vuelva a Certbot y presione ENTER para validar la solicitud de certificado y completar el proceso de emisión.

Esto tardará unos segundos, y luego verá una notificación confirmando que se ha emitido el certificado:

Output
... Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your-domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your-domain/privkey.pem ...

Ha ejecutado acme-dns-certbot por primera vez, ha configurado los registros DNS requeridos y ha emitido un certificado con éxito. A continuación, configurará las renovaciones automáticas de su certificado.

Paso 4 — Usando acme-dns-certbot

En este último paso, utilizará acme-dns-certbot para emitir más certificados y renovar los existentes.

Antes que nada, ya que ha emitido con éxito al menos un certificado utilizando acme-dns-certbot, puede seguir emitiendo certificados para los mismos nombres de DNS sin tener que agregar otro registro CNAME de DNS. Sin embargo, si desea adquirir un certificado para una subdominio diferente o un nombre de dominio completamente nuevo, se le pedirá que agregue otro registro CNAME.

Por ejemplo, podría emitir otro certificado wildcard independiente sin tener que volver a realizar la verificación:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain

Sin embargo, si intentara emitir un certificado para una subdominio, se le pediría que agregue un registro CNAME para la subdominio:

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d subdomain.your-domain

Esto mostrará una salida similar a la configuración inicial que realizó en el Paso 3:

Output
... Please add the following CNAME record to your main DNS zone: _acme-challenge.subdomain.your-domain CNAME 8450fb54-8e01-4bfe-961a-424befd05088.auth.acme-dns.io. Waiting for verification... ...

Ahora que puede utilizar acme-dns-certbot para emitir certificados, resulta conveniente considerar el proceso de renovación también.

Cuando los certificados se acerquen a su fecha de expiración, Certbot puede renovarlos automáticamente por ti:

sudo certbot renew

El proceso de renovación puede ejecutarse de principio a fin sin interacción del usuario y recordará todas las opciones de configuración que especificó durante la configuración inicial.

Para probar que esto funciona sin tener que esperar hasta una fecha de expiración más cercana, puedes disparar una simulación. Esto simulará el proceso de renovación sin hacer ningún cambio real a tu configuración.

Puedes disparar una simulación usando la orden estándar renew, pero con el argumento --dry-run:

sudo certbot renew --dry-run

Esto mostrará algo similar a lo siguiente, que proporcionará una seguridad de que el proceso de renovación está funcionando correctamente:

Output
... Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator manual, Installer None Renewing an existing certificate Performing the following challenges: dns-01 challenge for your-domain dns-01 challenge for your-domain Waiting for verification... Cleaning up challenges ...

En este paso final, has emitido otro certificado y luego has probado el proceso de renovación automática dentro de Certbot.

Conclusión

En este artículo, has configurado Certbot con acme-dns-certbot para emitir certificados usando la validación DNS. Esto desbloquea la posibilidad de usar certificados wildcard así como la administración de una amplia gama de servidores web distintos que puedan estar detrás de un balanceador de carga.

Asegúrate de mantener un ojo en el repositorio acme-dns-certbot para cualquier actualización del script, ya que siempre es recomendable ejecutar la versión más reciente soportada.

Si estás interesado en aprender más sobre acme-dns-certbot, tal vez desees revisar la documentación del proyecto acme-dns, que es el elemento del lado del servidor de acme-dns-certbot:

El software acme-dns también puede ser hospedado por sí mismo, lo cual podría ser beneficioso si estás operando en entornos de alta seguridad o complejos.

Alternativamente, podrías explorar los detalles técnicos de la validación de DNS ACME revisando la sección relevante del documento oficial RFC que describe cómo funciona el proceso:

Source:
https://www.digitalocean.com/community/tutorials/how-to-acquire-a-let-s-encrypt-certificate-using-dns-validation-with-acme-dns-certbot-on-ubuntu-18-04