Actualmente, los certificados SSL son tan populares que hasta resulta extraño ver sitios que no funcionan con su certificado de seguridad! Parte de la culpa la tiene Let’s Encrypt, un popular servicio de generación de certificados SSL gratuitos. En este artículo vamos a hablaros de esta herramienta y cómo Certbot permite la renovación de certificados automáticamente.
Qué es Certbot
Certbot es el software proporcionado por Let’s Encrypt para expedir y renovar certificados en sitios web. Funciona bajo consola de comandos y permite realizar de manera muy sencilla las comunicaciones con la entidad certificadora.
Certbot es un software gratuito que podemos instalar libremente en servidores Linux. Generalmente deberá funcionar en la máquina donde tengamos el servidor web y generará los certificados de los dominios alojados dentro.
Cómo instalar Certbot en Ubuntu
Certbot es compatible con cualquier distribución de Linux. En este post vamos a explicar los pasos para instalarlo en Ubuntu, donde Let’s Encrypt recomienda usar Snap, que es un sistema para la gestión de paquetes de software que se desean instalar en el sistema operativo.
Si estamos en una versión reciente de Ubuntu como la 22.04 ya tenemos Snap instalado de casa, si no es así podemos instalarlo con el siguiente comando.
sudo apt install snapd
Si ya teníamos Snap en nuestro servidor, antes de instalar Certbot conviene verificar que snap core está actualizado:
sudo snap install core; sudo snap refresh core
Una vez tenemos Snap instalado y actualizado podemos ya instalar Certbot con el siguiente comando:
sudo snap install --classic certbot
Esta operación la podemos completar haciendo que el comando certbot instalado por snap esté disponible como comando de consola para este usuario, creando el correspondiente enlace en la carpeta usr/bin:
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Cómo expedir certificados con Certbot
Ahora que tenemos instalado Certbot podemos solicitar la expedición de certificados para los dominios alojados en el servidor.
¡¡¡ Recuerda antes abrir los puertos del firewall 80 y 443 para HTTPS !!!
Luego expedimos los certificados indicando el nombre de dominio, con el siguiente comando:
sudo certbot certonly --standalone -d example.com
La opción –standalone sirve para que Certbot use el servidor web integrado para verificar la propiedad del dominio, que es la opción más cómoda e independiente del tipo de servidor web que tengas instalado en la máquina. Sin embargo, esta opción necesitará tener liberados los puertos del servidor web, para lo que tendrías que detenerlo antes.
Por ejemplo, si tienes Apache, para detenerlo lanzarás un comando como este:
sudo systemctl stop apache2.service
Una vez terminado el proceso necesitarás iniciar el servidor web.
sudo systemctl start apache2.service
Nota que, en el caso de que no fuera posible detener el servidor web, simplemente tienes que quitar –standalone e indicar el document root de cada dominio por separado, lo que es un poco menos ágil, pero te puede resultar necesario. Puedes encontrar más información en la documentación de Certbot.
Al generar los certificados obtendremos una salida del comando como esta:
En esa salida puedes encontrar especificada la carpeta donde está colocando los ficheros de los certificados expedidos. Como puedes apreciar los certificados estarán en disco del servidor, en la carpeta /etc/letsencrypt/live, dentro de un subdirectorio para cada dominio.
Por ejemplo podemos listar el contenido de la carpeta donde se han colocado los certificados para el dominio example.com en una carpeta como:
sudo ls /etc/letsencrypt/live/example.com
Obtendremos una salida como la que se ve en la siguiente imagen:
Se recomienda dejar los certificados en estas carpetas y usar las rutas a estas carpetas en la configuración del servidor web.
Renovaciones de certificados Let’s Encript
La entidad Let’s Encrypt emite certificados que son válidos por únicamente 90 días. Esto es a todas luces poco tiempo y nos generaría mucho trabajo si los certificados los tuviéramos que renovar a mano. Afortunadamente, podemos programar tareas en cron para conseguir que este mantenimiento se realice automáticamente.
Si hemos instalado Certbot por medio de Snap tenemos la ventaja de que se habrán creado las tareas de renovación de los certificados en trabajos que se van a ejecutar periódicamente. Por tanto, cuando llegue el momento de las renovaciones será posible actualizar los certificados sin necesidad de intervención humana.
Los certificados se pueden renovar cuando faltan 30 días o menos para su fecha de vencimiento. Por tanto, si acabamos de generar los certificados en principio no sería posible verificar si, llegado el momento de las renovaciones, se podrán ejecutar correctamente. También Certbot ha tenido en cuenta esta situación y nos ofrece una vía para verificar que las renovaciones se podrán realizar correctamente. Para ello existe un comando que simula la renovación:
sudo certbot renew --dry-run
Hooks de renovación de los certificados con Certbot
El máximo problema que nos podremos encontrar es que esta renovación requiera que se interactúe también con el servidor web, o con cualquier otra gestión que requieras hacer en el servidor. Por ejemplo es posible que tengas que detener el servidor web antes de renovar el certificado (e iniciarlo después) o bien reiniciar el servidor web una vez se renuevan los certificados para que se carguen las versiones actualizadas.
Para conseguir realizar todas estas tareas administrativas antes o después de que se ejecuten las renovaciones de los certificados existen una serie de hooks en los que podemos enganchar ciertos comandos.
Podemos configurar los hooks de Certbot con nuestro editor de consola preferido, modificando el código del fichero de configuración que está en la carpeta /etc/letsencrypt/renewal/ con el nombre del dominio cuyo certificado se deba renovar. Por ejemplo podemos abrir ese archivo con el comando:
nano /etc/letsencrypt/renewal/example.com.conf
Los Hooks que nos interesan para las renovaciones son estos:
- pre_hook: comandos a ejecutar antes de las renovaciones
- renew_hook: comandos a ejecutar después de las renovaciones
Estos hook los podemos colocar como contenido extra al final del archivo de configuración señalado anteriormente.
Para que tengas un ejemplo de definición de los hooks te dejamos este código, que permite parar Apache antes de la renovación, y volverlo a iniciar una vez que los certificados se han renovado.
pre_hook = systemctl stop apache2.service renew_hook = systemctl start apache2.service
Esperamos que este breve tutorial te haya resultado práctico a la hora de organizar la expedición de los certificados SSL con Let’s Encrypt y sus renovaciones automáticas.