HTTPS con Let's Encrypt y Certbot en Nginx: guía completa con redirección, renovación automática y solución de errores
Configura SSL/TLS gratuito en tu servidor Nginx con Certbot y Let's Encrypt. Aprende a forzar HTTPS, automatizar la renovación de certificados, solucionar errores comunes y aplicar configuraciones seguras de TLS. Todo paso a paso y listo para producción.
Por Equipo Starbyte
HTTPS con Let's Encrypt y Certbot en Nginx: guía completa con redirección, renovación automática y solución de errores
Problema real: Tienes un sitio web servido con Nginx, pero solo bajo HTTP. Los navegadores lo marcan como "No seguro", pierdes visitantes y posicionamiento SEO. Instalar un certificado SSL de pago es innecesario para la mayoría de los proyectos, pero configurar Let's Encrypt manualmente cada 90 días es tedioso y propenso a olvidos. Necesitas un flujo automático, robusto y que fuerce HTTPS en todo el tráfico.
Esta guía te entrega exactamente eso: desde cero, configurar Certbot con Nginx, obtener tu primer certificado, asegurar la renovación automática y dejar tu sitio perfectamente protegido.
Requisitos previos
- Servidor Ubuntu 20.04/22.04/24.04 con acceso root o sudo.
- Nginx instalado y funcionando (
sudo apt install nginx). - Un nombre de dominio que apunte (registro A) a la IP pública del servidor.
- Los puertos 80 y 443 abiertos en el firewall.
- (Recomendado) ssh configurado y snapd presente si prefieres la versión snap de Certbot (la oficial).
1. Instalación de Certbot y el plugin de Nginx
La forma recomendada por Let's Encrypt es usar el paquete snap de Certbot. Si ya tienes snapd, sigue estos pasos:
sudo apt update
sudo apt install snapd -y
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Ahora instala el plugin específico para Nginx:
sudo apt install python3-certbot-nginx -y
Verifica la instalación:
certbot --version
2. Configuración previa de Nginx (bloque de servidor)
Asegúrate de que Nginx esté sirviendo tu dominio en el puerto 80. Crea o edita un archivo de configuración en /etc/nginx/sites-available/tudominio.com:
server {
listen 80;
server_name tudominio.com www.tudominio.com;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
Habilita el sitio (si es nuevo):
sudo ln -s /etc/nginx/sites-available/tudominio.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Comprueba que tu dominio responde HTTP correctamente antes de seguir.
3. Obtener el certificado SSL
Ejecuta el comando interactivo de Certbot:
sudo certbot --nginx
Te preguntará:
- Correo electrónico (para avisos de expiración).
- Aceptar términos de servicio.
- Si deseas compartir tu correo con la EFF (opcional).
- Qué dominios quieres activar (los que encuentre en la configuración de Nginx). Normalmente aparecen todos en una lista numerada; puedes dejar en blanco para todos.
- Si quieres redirigir automáticamente HTTP a HTTPS: elige 2 (redirección automática).
Esto modificará tu archivo de configuración Nginx, añadiendo las líneas necesarias para SSL y la redirección.
Si prefieres hacerlo de manera no interactiva (útil en scripts):
sudo certbot --nginx --non-interactive --agree-tos --email admin@tudominio.com --domains tudominio.com,www.tudominio.com --redirect
4. Configuración resultante y comprobación
Después de ejecutar Certbot, tu archivo de configuración se verá similar a esto:
server {
server_name tudominio.com www.tudominio.com;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/tudominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tudominio.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
if ($host = www.tudominio.com) {
return 301 https://$host$request_uri;
}
if ($host = tudominio.com) {
return 301 https://$host$request_uri;
}
listen 80;
server_name tudominio.com www.tudominio.com;
return 404;
}
Verifica la sintaxis y recarga:
sudo nginx -t && sudo systemctl reload nginx
Accede a https://tudominio.com; verás el candado. Puedes auditar tu configuración TLS con:
curl -sL https://www.ssllabs.com/ssltest/analyze.html?d=tudominio.com
5. Renovación automática
Certbot instala automáticamente un timer de systemd que se ejecuta dos veces al día. Comprueba que está activo:
sudo systemctl list-timers certbot.timer
Para probar manualmente la renovación (sin forzarla):
sudo certbot renew --dry-run
Si no hay errores, la renovación se hará en los próximos 30 días antes de expirar. El comando real que se ejecuta diariamente es certbot renew, que procesa todos los certificados y solo renueva los próximos a vencer. Nginx se recarga automáticamente después porque el hook por defecto está en la configuración de renovación.
Puedes ver los hooks editando (no es necesario normalmente) /etc/letsencrypt/renewal/tudominio.com.conf; al final verás renew_hook = systemctl reload nginx.
6. Errores frecuentes y soluciones
| Error | Causa | Solución |
|---|---|---|
Could not automatically find a matching server block for tudominio.com |
No existe un bloque de servidor en Nginx con ese dominio | Crea o ajusta el archivo de configuración con server_name tudominio.com y recarga Nginx antes de ejecutar Certbot. |
Failed authorization procedure ... 403 o timeout |
Let's Encrypt no puede acceder al archivo de desafío .well-known/acme-challenge en tu servidor (puerto 80 no abierto, o Nginx mal configurado) |
Asegura que el firewall permita tráfico HTTP (puerto 80). Verifica que Nginx esté sirviendo el dominio y que no haya reglas que bloqueen el directorio .well-known. |
Connection refused en el paso de desafío |
Nginx no está corriendo o escucha solo en localhost | Revisa listen 80; y que esté asociado a la IP pública. Ejecuta `ss -tulpn |
The client lacks sufficient authorization |
Límite de peticiones excedido (5 por dominio por semana) | Espera a que pase el límite o usa el entorno de staging para pruebas: añade --dry-run o --test-cert. |
| El sitio carga HTTP sin redirigir a HTTPS | Elegiste la opción 1 (sin redirección) durante la configuración inicial | Vuelve a ejecutar sudo certbot --nginx --redirect o manualmente añade el bloque de redirección 301 en el puerto 80. |
certbot renew falla con error de conexión |
Problema de red o DNS | Comprueba que desde el servidor se pueda resolver el dominio y que el puerto 80 esté accesible desde el exterior. |
7. Casos prácticos de uso
7.1 Certificado único para múltiples dominios (SAN)
Si tienes varios dominios o subdominios en el mismo servidor, puedes obtener un solo certificado con todos ellos:
sudo certbot --nginx -d dominio1.com -d www.dominio1.com -d api.dominio1.com
Esto incluye todos los nombres en el mismo certificado y la redirección se aplica según estén configurados en Nginx.
7.2 Certificado wildcard (requiere validación DNS)
Para proteger *.tudominio.com necesitas un desafío DNS, no HTTP. Instala el plugin de tu proveedor DNS (ej. Cloudflare):
sudo apt install python3-certbot-dns-cloudflare
Crea un archivo de credenciales (protegido) y ejecuta:
sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /ruta/credenciales.ini -d tudominio.com -d *.tudominio.com
Luego configura Nginx manualmente apuntando a los certificados en /etc/letsencrypt/live/tudominio.com/.
7.3 Configuración TLS avanzada para máxima seguridad
Edita el archivo de opciones SSL incluido por Certbot (/etc/letsencrypt/options-ssl-nginx.conf) y personaliza:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
Recarga Nginx. Puedes probar tu configuración con la herramienta SSL Labs.
8. Buenas prácticas
- No modifiques manualmente los archivos de renovación dentro de
/etc/letsencrypt/renewal/a menos que sepas lo que haces. Cualquier cambio puede romper la renovación automática. - Usa siempre
--dry-runal probar renovaciones para no exceder los límites de Let's Encrypt. - Respaldar
/etc/letsencryptperiódicamente, especialmente después de añadir nuevos certificados. Incluye las claves privadas; sin ellas no podrás restaurar. - Implementa HSTS una vez que verifiques que HTTPS funciona correctamente. Añade en tu bloque SSL:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
- Monitoriza la expiración incluso con renovación automática. Puedes usar un check externo como UptimeRobot en la raíz HTTPS y un script simple que lea
certbot certificates. - Si migras de servidor, copia
/etc/letsencryptcon cuidado y restaura la configuración de Nginx exacta. Los certificados son transferibles.
9. Cierre con idea clave
No hay excusa para que un sitio web moderno carezca de HTTPS. Con Let's Encrypt y Certbot, dispones de una capa de seguridad profesional, gratuita y que se mantiene a sí misma sin intervención manual. Configúralo una vez y olvídate de los avisos de "sitio no seguro" para siempre.