Validación DNS de certificados Let’s Encrypt en Linode

por | enero 18, 2020

Hace tiempo que tengo configurado HTTPS para el blog con Let’s Encrypt. Como vimos por entonces el método de validación HTTP nos obliga a crear un fichero con un determinado contenido disponible en nuestro sitio web para poder generar y renovar certificados SSL. A medida que vamos administrando más servidores este método no escala demasiado bien y nos hace perder bastante tiempo, especialmente si generamos los certificados en modo manual.

Por otro lado, la alternativa del modo automático de certbot no me llega a convencer ya que aunque permite delegar toda la generación y renovación de certificados, obliga a instalar certbot en los servidores donde vamos a utilizarlos posteriormente. En mi caso prefiero gestionar los certificados desde un servidor central y más tarde distribuirlos en los servidores donde voy a instalarlos.

Existe una alternativa -más práctica a mi parecer- al método de validación HTTP que es por DNS. Su funcionamiento es sencillo: se basa en publicar un registro TXT con un determinado valor en el DNS del proveedor de forma que Certbot pueda verificar que somos los propietarios del dominio en el momento de creación o renovación de un certificado. Este es el método que prefiero ya que como decía me permite centralizar la gestión de certificados en un servidor sin crear dependencias adicionales. Los requisitos son:

  1. Que nuestro proveedor de hosting permita publicar registros DNS mediante llamadas a la API.
  2. Un token para autenticar con la API. Es recomendable que dicho token tenga permisos limitados (sólo para operaciones DNS) y que lo utilicemos en un único servidor centralizado para disminuir el riesgo de seguridad. Podéis encontrar documentación de Linode aquí sobre cómo generar un token para la API con permisos limitados.

Si cumplimos estos requisitos, creamos un fichero linode.ini con el valor de la API Key:

dns_linode_key = 1234abcd

Lanzamos el comando certbot especificando los parámetros correspondientes:

certbot certonly \
  --dns-linode \
  --dns-linode-credentials ./linode.ini \
  -d www.elarraydejota.com -d elarraydejota.com

El proceso de validación tarda por defecto 20 minutos ya que no sólo hay que publicar el registro TXT sino también esperar a que se propague por los servidores DNS del proveedor:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator dns-linode, Installer None
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for elarraydejota.com
dns-01 challenge for www.elarraydejota.com
Starting new HTTPS connection (1): api.linode.com
Starting new HTTPS connection (1): api.linode.com
Starting new HTTPS connection (1): api.linode.com
Starting new HTTPS connection (1): api.linode.com
Starting new HTTPS connection (1): api.linode.com
Starting new HTTPS connection (1): api.linode.com
Waiting 1200 seconds for DNS changes to propagate
Waiting for verification...
Resetting dropped connection: acme-v02.api.letsencrypt.org
Cleaning up challenges
Starting new HTTPS connection (1): api.linode.com
Starting new HTTPS connection (1): api.linode.com
Starting new HTTPS connection (1): api.linode.com
Starting new HTTPS connection (1): api.linode.com
Starting new HTTPS connection (1): api.linode.com
Starting new HTTPS connection (1): api.linode.com
Starting new HTTPS connection (1): api.linode.com

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www.elarraydejota.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www.elarraydejota.com/privkey.pem
   Your cert will expire on 2020-03-04. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Una vez completado el proceso tendremos nuestro certificado, clave privada y chain en /etc/letsencrypt/live/(dominio). Para renovar certificados el proceso sigue siendo el mismo.

Además de ser un método más rápido que el manual por HTTP, otra de las ventajas es que nos permitirá crear certificados wildcard.

En mi caso trabajo con Linode como proveedor, pero podemos validar certificados por DNS con muchos otros proveedores conocidos como Digital Ocean o Google Cloud como podéis ver en su documentación.