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:
- Que nuestro proveedor de hosting permita publicar registros DNS mediante llamadas a la API.
- 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.