HTTPS con un certificado gratuito de letsencrypt.org y Certbot

Let’s Encrypt es una autoridad certificadora (CA) abierta, gratuita, y libre. Llevan funcionando menos de un año, desde 2016, y se puede decir que es un servicio público, dirigido a promover y facilitar la obtención y configuración de certificados de seguridad para la web. Lo que ofrecen son certificados X.509 por dominio que podemos usar para TLS.

https://letsencrypt.org/

Hay varias organizaciones involucradas en el proyecto, siendo la principal la Internet Security Research Group (ISRG), junto a otras como Linux Foundation o Mozilla Foundation, pero también gigantes como Akamai o Cisco Systems. Es decir, que hay gente grande detrás, y el proyecto es bastante interesante, esperemos que dure.

Hasta ahora conseguir un certificado de seguridad para configurar HTTPS como es debido era bastante engorroso, además de que solía ser bastante caro. Últimamente los precios habían comenzado a bajar, pero ahora podemos conseguir un certificado propio por la cara, y con una instalación muy sencilla.

La principal ventaja del servicio se basa en la automatización de todo el proceso. El objetivo es configurar un servidor HTTPS y obtener un certificado de confianza para los navegadores sin intervención humana. Y dejarme deciros que me ha funcionado de verdad, y a la primera. 

Esta automatización es la clave de todo el asunto, primero porque los certificados que nos ofrecen solamente son válidos por 90 días, lo que nos va a obligar a configurar la renovación de forma automática si no queremos estar cada tres meses renovando el certificado de forma manual.

Para esto han ideado un protocolo llamado ACME (Automated Certificate Management Environment), y el truco consiste en instalar un agente que se encargue de realizar automáticamente la petición y renovación del certificado, validando el solito nuestros dominios. Tenemos unos cuantos disponibles, pero el que recomiendan desde letsencrypt.org es Certbot:

https://certbot.eff.org

Certbot esta empaquetado en los repos de Debian, pero deberemos usar el repositorio de backports. Para ello basta con incluir una línea en nuestro fichero /etc/apt/sources.list. Si estáis usando Jessie (Debian 8) será:

deb http://ftp.debian.org/debian jessie-backports main

Después actualizamos:

apt-get update

Ahora ya podemos instalar el cliente de Certbot:

$ sudo apt-get install python-certbot-apache -t jessie-backports

Una vez instalado, ya podemos ejecutarlo, si estamos usando Apache, así:

$ certbot --apache

Y ya está. Lo juro. El instalador nos hará una serie de preguntas sobre los certificados que queremos instalar y listo. En mi caso tenia un Apache2 con varios VirtualHosts con diferentes nombres de dominio y alias, todos por el puerto 80. El instalador hizo solito todo esto:

  • Realizo una copia de cada fichero de configuración de VirtualHost, añadiendo -le-ssl.conf al nombre, y configuró en ellos el certificado.
  • En cada VirtualHost original, añadió una redirección automática a su versión de HTTPS
  • Configuró un servicio en Cron /etc/cron.d/certbot para realizar automáticamente la renovación de los certificados.
  • Reinicio el servidor Apache para cargar la nueva configuración.

Si no os hace mucha gracia que os toque la configuración, o tenéis algo realmente chungo montado, también podemos hacer que solamente consiga el certificado, y configurarlo nosotros a mano, así:

$ certbot --apache certonly

En mi caso, añadió las siguientes líneas a mis archivos de VirtualHost originales en el 80:

RewriteEngine on
RewriteCond %{SERVER_NAME} =xxxxx.com [OR]
RewriteCond %{SERVER_NAME} =www.xxxxx.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]

Los nuevos ficheros para SSL que creó Certbot son copias de los que yo tenía, en los que se añade la configuración del certificado:

SSLCertificateFile /etc/letsencrypt/live/xxxxxxx/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/xxxxxxxx/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf

Y este es el archivo que añade al Cron en /etc/cron.d/certbot para automatizar la renovación de los certificados:

# /etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc.  Renewal will only occur if expiration
# is within 30 days.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew

Podemos hacer una simulación del proceso de renovación de los certificados con este comando:

certbot renew --dry-run 

Esto nos dará una idea de si funcionará o no cuando lo tenga que hacer el solo.

De momento, está funcionando perfectamente. Ya veremos cuando llegue la primera renovación...

 

Referencias