Let’s Encrypt y Certbot en GNU/Linux – HTTPS

Publicado por Diego Córdoba en

Hoy aprenderemos a instalar y configurar Let’s Encrypt para obtener certificados digitales x509 para montar sitios web HTTPS (SSL/TLS) en nuestros servidores web de manera gratuita.

Este artículo forma parte de la Serie sobre Criptografía Aplicada publicada en este blog. Pueden visitar el índice de la serie para acceder a todo el contenido.

¿Qué es Let’s Encrypt?

Anteriormente hablamos sobre autoridades certificantes (CA) y cómo funciona la Infraestructura de clave pública (PKI) para brindar confianza a sitios en Internet mediante el uso de certificados digitales x509.

Por su parte, en una oportunidad también comentábamos la utilidad ssl-cert como front-end de OpenSSL para gestionar certificados digitales.

Vimos que, para poder montar un sitio web HTTPS era necesario poseer un par de claves, privada y púbica esta última encapsulada en un certificado digital, que a su vez debía estar firmado por una autoridad certificante reconocida.

Tradicionalmente debíamos crear un petición de firma de certificado digital, enviarla a una autoridad certificante, y pagar para obtener un certificado firmado válido.

Let’s Encrypt nos permite realizar este procedimiento de manera automatizada y gratuita, y su configuración es relativamente sencilla.

A continuación veremos los pasos principales para configurar Let’s Encrypt en un servidor Debian GNU/Linux, tanto para Apache como para Nginx. Por supuesto, vamos a hacerlo por línea de comandos 😛

Certbot: la forma fácil de gestionar Let’s Encrypt

La documentación oficial, la manera recomendada de utilizar Let’s Encrypt es mediante la utilidad Certbot.

Certbot es una utilidad de código abierto desarrollada por la EFF para actualizar automáticamente los certificados en sitios web HTTPS que hacen uso de Let’s Encrypt como autoridad certificante.

Certbot renueva los certificados automáticamente cada 60 días, por lo que en GNU/Linux podemos planificar la ejecución de las tareas de actualización mediante crontab.

Instalando y configurando Certbot

La documentación oficial indica su instalación mediante el paquete snap. Yo lo he instalado utilizando el gestor de paquetes de Debian, pero les comparto ambas soluciones.

Instalación mediante snap

Primero debemos asegurarnos que estamos utilizando la última versión de snapd:

sudo snap install core; sudo snap refresh core

Eliminar certob-auto y cualquier otro paquete Certbot provisto por el sistema operativo. Para el caso de Debian y derivados, sería algo así:

sudo apt-get remove certbot

Instalar, ahora, certbot mediante la utilidad snap:

sudo snap install --classic certbot

Paso siguiente, cargar snap en el directorio de binarios del sistema para poder ejecutarlo directamente sin especificar el path:

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Instalación mediante apt en Debian

Cada distro tiene, en general, una versión de certbot entre los paquetes de su repositorio de software. Si bien la forma recomendada es la explicada anteriormente, en mi caso particular lo hice mediante el repositorio de Debian, y no he tenido problemas.

La instalación la hice con el siguiente comando:

sudo apt -y install certbot python3-certbot-apache

Particularmente yo utilicé el paquete python3-certob-apache puesto que mi servidor web es Apache, pero también existe el paquete python3-certbot-nginx para quienes usen Nginx.

Configuración de un sitio

Ahora que tenemos certbot instalado, podríamos comprobar su versión utilizando:

certbot --version
certbot 1.12.0

Certbot permite gestionar gran cantidad de parámetros, y diversas acciones sobre los certificados digitales que manipula. Veremos ahora algunas acciones principales.

Primero que nada, obviamente, necesitamos tener corriendo un servidor web, sirviendo algunos sitios web, al menos uno.

Además, es requisito que el sitio sea accesible desde Internet, ya que Certbot intentará contactarlo desde afuera a los puertos 80 y 443 de TCP para poder validarlo y brindarle un certificado digital. Por cierto, el sitio debe ser accesible mediante un dominio.

Supongamos que tenemos un servidor Apache, corriendo un sitio cuyo dominio es juncotic.com.

Si quisiéramos habilitar HTTPS para dicho sitio, deberíamos correr un comando similar a este:

certbot --apache -d juncotic.com

Con este comando estamos indicando a Certbot que utilice el plugin de autenticación de Apache. El comando nos solicitará aceptar los términos de licencia, y procederá a llevar a cabo una solicitud de desafío para obtener un certificado Let’s Encrypt válido.

Podríamos haber utilizado el modificador --nginx para configurar los sitios HTTPS en Nginx.

Además, si queremos realizar el procedimiento para varios sitios, podemos separar los dominios con coma, o añadiendo varios modificadores -d. En el caso de no colocar ninguno, certbot nos solicitará los dominios de manera interactiva.

Un punto importante: si ya tenemos un sitio HTTP y queremos mantener ambos, HTTP y HTTPS, deberemos responder afirmativamente cuando el certbot, durante su configuración, nos pregunte si queremos configurar automáticamente la redirección de tráfico tcp80 al puerto tcp443. Esta sería la manera correcta de habilitar HTTPS por defecto.

Una vez terminada la configuración, tendremos el sitio corriendo mediante HTTPS, así de sencillo.

Omitiendo la configuración del servidor web

Este comando obtiene un certificado válido, y configura el Virtual Host del servidor web para hacer uso de HTTPS de manera predeterminada.

Si no queremos que Certbot toque nuestras configuraciones, y solamente deseamos obtener el certificado, para luego configurar el servidor nosotros a mano, podemos hacerlo mediante:

certbot certonly --apache -d juncotic.com

Renovando el certificado

Cuando uno «compra» un certificado digital a una autoridad certificante válida como las mencionadas en nuestro artículo anterior, la CA nos va a cobrar dependiendo, entre otras cosas, del tiempo de validez que configuremos en el certificado. Es decir, sale más caro un certificado válido por 5 años que uno válido por 1 año.

Let’s Encrypt estableció como política forzar la renovación de certificados cada 3 meses, por lo que, si montamos nuestro sitio HTTPS y no actualizamos nunca más el certificado, luego de los primeros 3 meses los visitantes obtendrán una advertencia de certificado caducado en sus navegadores.

Certbot permite realizar la actualización automática de certificados si los mismos están a menos de 30 días de vencerse.

El comando para realizar la renovación es el siguiente:

certbot renew

Si queremos testear la renovación pero sin que esto afecte al sistema, es decir, sin almacenar los certificados obtenidos en el disco, podemos añadir el modificador --dry-run:

certbot renew --dry-run

Una salida simulada de renovación podría ser la siguiente:

let's encrypt certbot renew

Para realizar la tarea de actualización automáticamente, la instalación de Certbot añade una línea de configuración al Crontab. En Debian tengo dicha línea en un archivo de configuración de crontab llamado /etc/cron.d/certbot.

No obstante, dependiendo de la distro, puede que dicha configuración quede dentro de /etc/crontab/ o en /etc/cron.*/*.

Si deseamos saber si ha sido planificado correctamente la ejecución del renovador de certificados de certbot, podemos preguntarle cada cuánto realiza la verificación:

systemctl status certbot.timer
let's encrypt certbot.timer

Otras curiosidades de Certbot y Let’s Encrypt

Antes que nada, la mejor forma de verificar que las configuraciones funcionaron, es acceder, mediante un navegador, al sitio web configurado usando su dominio. Si todo salió bien, veremos el candadito de TLS, y en la URL el protocolo https://.

Si quisiéramos listar los certificados que en este momento está manteniendo actualizados Certbot podemos usar este comando:

sudo certbot certificates
let's encrypt certbot certificates

Otros dos comandos interesantes son el comando revoke de certbot, destinado a revocar un certificado indicando su dominio con --cert-name o la ruta al archivo de certificado mediante --cert-path.

Revoke forzará la caducidad de un certificado, si queremos borrarlo podemos usar el subcomando delete de certbot.

Let’s Encrypt mantiene las configuraciones de cada certificado dentro de /etc/letsencrypt/renewal (en el caso de Debian). Ahí dentro tendremos un archivo por dominio, con las configuraciones propias del mismo, como período de tiempo previo al vencimiento para realizar la renovación, archivo de certificado digital, y archivo de clave privada asociado.

Conclusiones

Hemos analizado cómo utilizar Let’s Encrypt y Certbot para gestionar de manera automatizada los certificados digitales en Debian. Para otras distros el procedimiento es similar (si usan snap, el procedimiento será el mismo).

Cabe aclarar que para realizar estos pasos es necesario que seamos el administrador del servidor web y de su sistema operativo. Algunos hostings proveen interfaces de administración web y ofrecen servicios de gestión de certificados digitales mediante Let’s Encrypt.

Si bien todos los hostings decentes permiten el uso de HTTPS mediante TLS y certificados digitales, no todos soportan Let’s Encrypt. La lista de los que sí soportan puede verse acá.

Por cierto, muchos hostings brindan servicio de gestión de certificados digitales cuando uno adquiere el hosting o el dominio. Algunas veces el certificado digital va incluido con el hosting, otras puede obtenerse añadiendo un pago extra.

Finalmente, les comento que, si no tenemos un hosting que soporte Let’s Encrypt, y queremos utilizarlo igualmente, podemos generar un certificado válido para nuestro dominio de manera manual en nuestra computadora, y luego moverlo al servidor web. Claro está que este procedimiento debemos realizarlo para cada renovación.

Para quien quiera incursionar en el modo manual de Certbot lo invito a visitar la doc oficial.


Sin más, espero que les haya resultado entretenido y útil!

Como siempre quedo a disposición para lo que necesiten, ya saben dónde ubicarme.

Será hasta la próxima!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador