HTTPS gratis con Let’s Encrypt
Básico
Los pasos marcados en azul cambian según tu sistema.
Una web sin HTTPS viaja en claro: cualquiera en medio —la wifi de la cafetería, tu operador, quien controle un router por el camino— puede leer lo que se envía o incluso modificarlo. Hasta hace unos años, cifrarla costaba dinero. Let’s Encrypt, una autoridad de certificación sin ánimo de lucro, lo cambió: hoy cualquiera puede tener un certificado válido, gratis y renovado automáticamente. El cifrado no debería ser un lujo, y ya no lo es.
En este tutorial usarás Certbot, la herramienta que habla con Let’s Encrypt, para conseguir un certificado para tu sitio en Nginx, activar HTTPS y dejar la renovación en piloto automático.
Lo que necesitas
- Nginx funcionando, con un bloque de configuración para tu dominio. Si aún no lo tienes, sigue tu servidor web con Nginx.
- Un dominio (aquí,
ejemplo.orgywww.ejemplo.org) con sus registros DNS apuntando a la IP de tu servidor. Let’s Encrypt comprobará que el dominio es tuyo conectándose a él, así que tiene que resolver ya a tu máquina. - El puerto 80 abierto: la comprobación se hace por HTTP.
Paso 1: instalar Certbot
Ubuntu
sudo apt update
sudo apt install certbot python3-certbot-nginx
Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx
AlmaLinux / Rocky
Certbot está en EPEL, el repositorio de paquetes extra para la familia Red Hat:
sudo dnf install epel-release
sudo dnf install certbot python3-certbot-nginx
El segundo paquete es el complemento para Nginx: permite a Certbot editar tu configuración por ti para instalar el certificado.
Paso 2: comprobar el nombre del sitio
Certbot encuentra qué bloque de Nginx corresponde a tu dominio buscando la línea server_name. Asegúrate de que está y de que incluye todos los nombres para los que quieres certificado:
Ubuntu
grep server_name /etc/nginx/sites-available/ejemplo.org
Debian
grep server_name /etc/nginx/sites-available/ejemplo.org
AlmaLinux / Rocky
grep server_name /etc/nginx/conf.d/ejemplo.org.conf
server_name ejemplo.org www.ejemplo.org;
Si has tenido que cambiar algo, comprueba la configuración y recarga: sudo nginx -t && sudo systemctl reload nginx.
Paso 3: abrir HTTPS en el cortafuegos
Ubuntu
Cambia el perfil de solo HTTP por el que abre los dos puertos:
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
Debian
Cambia el perfil de solo HTTP por el que abre los dos puertos:
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
AlmaLinux / Rocky
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
No cierres el puerto 80: lo necesitan las renovaciones y la redirección de las visitas que lleguen por HTTP.
Paso 4: pedir el certificado
Con un solo comando, Certbot pide el certificado, demuestra a Let’s Encrypt que controlas el dominio, lo instala en Nginx y activa la redirección de HTTP a HTTPS:
sudo certbot --nginx -d ejemplo.org -d www.ejemplo.org
La primera vez te hará un par de preguntas: una dirección de correo para recuperar tu cuenta si hiciera falta (es opcional) y la aceptación de las condiciones de uso. Después:
Requesting a certificate for ejemplo.org and www.ejemplo.org
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/ejemplo.org/fullchain.pem
Key is saved at: /etc/letsencrypt/live/ejemplo.org/privkey.pem
This certificate expires on 2027-01-16.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for ejemplo.org to /etc/nginx/sites-enabled/ejemplo.org
Successfully deployed certificate for www.ejemplo.org to /etc/nginx/sites-enabled/ejemplo.org
Congratulations! You have successfully enabled HTTPS on https://ejemplo.org and https://www.ejemplo.org
Abre https://ejemplo.org: verás el candado. Y si entras por http://, te llevará solo a la versión cifrada.
Si quieres ver qué ha tocado Certbot, abre de nuevo tu bloque de configuración: verás líneas nuevas marcadas con # managed by Certbot.
Paso 5: que se renueve solo
Los certificados de Let’s Encrypt duran 90 días. Es a propósito: obliga a automatizar la renovación, y un certificado robado sirve durante poco tiempo. Además, Let’s Encrypt ya no envía avisos de caducidad por correo, así que la renovación automática no es opcional.
Ubuntu
El paquete de Certbot instala un temporizador de systemd que intenta renovar dos veces al día (solo renueva cuando faltan menos de 30 días). Compruébalo:
systemctl list-timers certbot.timer
Debian
El paquete de Certbot instala un temporizador de systemd que intenta renovar dos veces al día (solo renueva cuando faltan menos de 30 días). Compruébalo:
systemctl list-timers certbot.timer
AlmaLinux / Rocky
En AlmaLinux y Rocky, el temporizador de renovación viene instalado pero apagado. Actívalo:
sudo systemctl enable --now certbot-renew.timer
systemctl list-timers certbot-renew.timer
Y haz un simulacro para asegurarte de que la renovación funcionará cuando llegue el momento:
sudo certbot renew --dry-run
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/ejemplo.org/fullchain.pem (success)
Si el simulacro sale bien, no tendrás que volver a pensar en el certificado.
Si algo falla
- El dominio no resuelve a tu servidor. Let’s Encrypt no puede comprobar que es tuyo. Mira con
dig +short ejemplo.orgque devuelve la IP de tu servidor (los cambios de DNS pueden tardar un rato en propagarse). - El puerto 80 está cerrado en tu cortafuegos o en el de tu proveedor. La comprobación necesita llegar por HTTP.
- Demasiados intentos. Let’s Encrypt limita cuántos certificados puedes pedir para un mismo dominio en una semana. Mientras pruebas, añade
--dry-runa tus comandos: usa el entorno de pruebas, que no cuenta para esos límites. - Quieres un certificado para todos los subdominios (
*.ejemplo.org). Los certificados comodín no se pueden validar por HTTP, sino creando un registro en el DNS del dominio. Certbot lo permite con--manual --preferred-challenges dns, aunque para renovarlos solos necesitarás el complemento de tu proveedor de DNS.
Un paso más: HSTS
Con HTTPS funcionando, puedes pedir a los navegadores que no vuelvan a intentar entrar en tu sitio sin cifrar. Se hace con la cabecera HSTS, dentro del bloque server que escucha en el 443:
/etc/nginx/sites-available/ejemplo.org
add_header Strict-Transport-Security "max-age=31536000" always;
Ojo: durante el tiempo indicado (aquí, un año), los navegadores que hayan visitado tu web se negarán a abrirla sin HTTPS. Actívala solo cuando tengas claro que el sitio va a seguir con su certificado.
Hecho
Tu web ya viaja cifrada, con un certificado que se renueva solo y sin pagar a nadie por ello. Repite el paso 4 para cada dominio que sirvas, y que ninguna web tuya vuelva a ir en claro.
