Crear un certificado SSL gratuito con Let's Encrypt y Certbot
Instalar Certbot, obtener un certificado para Nginx o Apache, gestionar los wildcards y asegurarse de que la renovación automática funciona de verdad.
Lectura: 3 min Actualizado el 26 octubre 2026
Let's Encrypt emite gratuitamente certificados reconocidos por todos los navegadores. Certbot es el cliente más extendido para obtenerlos y renovarlos automáticamente. Esta guía cubre un servidor Linux con Nginx o Apache. Si su proveedor de alojamiento ofrece un botón «SSL gratuito» o «Let's Encrypt», úselo: se encarga de todo por usted.
Requisitos previos
- Un nombre de dominio cuyos registros DNS (A y/o AAAA) apunten a su servidor.
- El puerto 80 accesible desde Internet: Let's Encrypt comprueba que usted controla el dominio mediante una petición HTTP.
- Acceso
sudoal servidor.
1. Instalar Certbot
El método recomendado por la EFF utiliza snap:
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
En Debian o Ubuntu, el paquete de la distribución también funciona:
sudo apt install certbot python3-certbot-nginx # o python3-certbot-apache
2. Obtener el certificado
Con Nginx o Apache (lo más sencillo)
Certbot obtiene el certificado y modifica la configuración del servidor:
sudo certbot --nginx -d ejemplo.es -d www.ejemplo.es
# o
sudo certbot --apache -d ejemplo.es -d www.ejemplo.es
Indique todos los nombres que deben quedar cubiertos, cada uno con su -d. Después, Certbot propone redirigir HTTP a HTTPS: acepte.
Sin tocar la configuración (webroot)
Si prefiere gestionar la configuración usted mismo, o si utiliza otro servidor web:
sudo certbot certonly --webroot -w /var/www/ejemplo -d ejemplo.es -d www.ejemplo.es
Los archivos se crean en /etc/letsencrypt/live/ejemplo.es/:
fullchain.pem: el certificado y los intermedios. Es el que hay que declarar en el servidor.privkey.pem: la clave privada.
ssl_certificate /etc/letsencrypt/live/ejemplo.es/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ejemplo.es/privkey.pem;
Usar cert.pem en lugar de fullchain.pem es el error más habitual: el sitio funciona en Chrome, pero no en las aplicaciones ni con curl.
Certificado wildcard (*.ejemplo.es)
Un wildcard exige una validación DNS: un registro TXT que hay que crear en cada renovación. Para automatizarlo, use el plugin DNS de su proveedor (Cloudflare, OVHcloud, Gandi, Route 53…):
sudo certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
-d ejemplo.es -d '*.ejemplo.es'
Evite --manual en producción: el certificado no podrá renovarse automáticamente.
3. Comprobar la renovación automática
Los certificados de Let's Encrypt duran 90 días. Certbot instala una tarea programada que intenta la renovación dos veces al día. Solo sustituye realmente el certificado unos 30 días antes del vencimiento.
sudo certbot renew --dry-run # simulación completa
systemctl list-timers | grep certbot
sudo certbot certificates # fechas de caducidad actuales
Para que el servidor tenga en cuenta el nuevo certificado, añada un deploy hook. Solo se ejecuta tras una renovación correcta:
sudo sh -c 'printf "#!/bin/sh\nsystemctl reload nginx\n" > /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh'
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
4. Las trampas que hacen fallar una renovación
- Puerto 80 cerrado más adelante: cortafuegos, regla de seguridad de la nube o redirección que no deja pasar
/.well-known/acme-challenge/. - DNS modificado: el dominio apunta ahora a una CDN o a otro servidor.
- Migración de servidor: se copiaron los certificados, pero no Certbot ni su tarea programada.
- Límites de Let's Encrypt: demasiadas solicitudes para el mismo dominio en poco tiempo. Para sus pruebas, use
--test-cert, que pasa por el entorno de pruebas, con límites mucho más amplios. - Servidor nunca recargado: el certificado se ha renovado en el disco, pero no se sirve a los visitantes.
5. Lo que cambia en Let's Encrypt
- No más correos de caducidad desde el 4 de junio de 2025. Let's Encrypt ya no le avisa cuando un certificado va a caducar (detalles aquí).
- Duraciones más cortas: 64 días a partir de febrero de 2027 y 45 días en febrero de 2028 para el perfil por defecto. Por lo tanto, una renovación fallida dejará cada vez menos tiempo para reaccionar.
Es justo lo que cubre SSL Expiration Reminder: añada sus dominios y, si un certificado no se ha renovado a tiempo, recibirá una alerta por correo electrónico, Slack o Telegram antes de que sus visitantes se encuentren con una página de error. Nuestro asistente de renovación también genera los comandos de Certbot adecuados para su servidor.