Habilitar HTTPS en Flask con Let's Encrypt y Nginx - Episodio 19

Servir tu aplicación Flask sin HTTPS en 2025 es como dejar la puerta de tu casa abierta.
Por eso, en este post te cuento cómo habilité HTTPS con Let's Encrypt y Nginx, los errores que encontré y...
Por supuesto, cómo los solucioné. 🚀🔐
- 🚀 ¿Por qué necesito HTTPS en mi aplicación Flask? 📅 Diario de un SaaS
- 🔍 Problema: Servir Flask con Nginx sin HTTPS
- 🛠️ Instalación de Let's Encrypt y Generación del Certificado
- 🔧 Configuración de Nginx para Forzar HTTPS
- 🔄 Automatización de la Renovación del Certificado
- ❌ Errores encontrados y cómo los solucioné
- 💡 Aprendizajes del proceso
- 🚀 Próximos Pasos
🚀 ¿Por qué necesito HTTPS en mi aplicación Flask? 📅 Diario de un SaaS
Después de configurar Gunicorn y Nginx, la aplicación ya estaba corriendo en producción.
Pero había un problema serio: estaba sirviendo todo en HTTP sin cifrar.
Y claro, en pleno 2025, eso es una receta para el desastre.
🔴 ¿Qué riesgos hay al no usar HTTPS?
1️⃣ Los datos viajan sin cifrar. Cualquier persona en la misma red puede interceptar información. 🚨
2️⃣ Google penaliza los sitios sin HTTPS. Sí, si tu aplicación no tiene HTTPS, afectará al SEO y la confianza de los usuarios. 📉
3️⃣ Muchos navegadores bloquean sitios sin HTTPS. La clásica advertencia "Este sitio no es seguro" hará que la mayoría de los usuarios huyan. 🚷
No había más opciones: tenía que implementar HTTPS con Let's Encrypt.
🔍 Problema: Servir Flask con Nginx sin HTTPS
La aplicación Flask estaba funcionando perfectamente con Gunicorn detrás de Nginx, pero el tráfico solo estaba disponible en HTTP.
Por eso, necesitaba:
✅ Obtener un certificado SSL gratuito con Let's Encrypt.
✅ Configurar Nginx para forzar HTTPS.
✅ Automatizar la renovación del certificado para evitar problemas.
🛠️ Instalación de Let's Encrypt y Generación del Certificado
✅ 1. Instalar Certbot (Let's Encrypt)
Certbot es la herramienta oficial para obtener certificados SSL de Let's Encrypt:
sudo apt update && sudo apt install certbot python3-certbot-nginx -y
✅ 2. Generar el Certificado SSL
Ejecutamos el siguiente comando para generar un certificado para nuestro dominio:
sudo certbot --nginx -d mi-dominio.com -d www.mi-dominio.com
🔹 ¿Qué hace este comando?
--nginx: Configura automáticamente Nginx para usar HTTPS.-d mi-dominio.com -d www.mi-dominio.com: Especifica el dominio para el certificado.
Si todo sale bien, obtendrás un mensaje confirmando que el certificado ha sido generado y configurado en Nginx.
🔧 Configuración de Nginx para Forzar HTTPS
✅ 3. Redirigir HTTP a HTTPS
Abrimos el archivo de configuración de Nginx:
sudo nano /etc/nginx/sites-available/mi_saas
Nos aseguramos de que toda conexión HTTP se redirija automáticamente a HTTPS añadiendo esto:
server {
listen 80;
server_name mi-dominio.com www.mi-dominio.com;
return 301 https://$host$request_uri;
}
Esto garantiza que todas las peticiones HTTP sean redirigidas a HTTPS de forma automática.
✅ 4. Reiniciar Nginx para aplicar los cambios
sudo systemctl restart nginx
Ahora, cualquier intento de acceder por HTTP será redirigido a HTTPS.
🔄 Automatización de la Renovación del Certificado
El certificado SSL de Let's Encrypt expira cada 90 días, por lo que es importante automatizar su renovación.
✅ 5. Configurar la renovación automática
Ejecutamos un test de renovación para asegurarnos de que funciona:
sudo certbot renew --dry-run
Si no hay errores, podemos programar una tarea automática en cron para renovar el certificado automáticamente:
sudo crontab -e
Añadimos esta línea para que la renovación se ejecute cada mes:
0 3 * * 1 certbot renew --quiet
Esto significa que, cada lunes a las 3:00 AM, Certbot verificará si el certificado necesita ser renovado y lo hará automáticamente.
❌ Errores encontrados y cómo los solucioné
🔴 Could not bind to port 80 al ejecutar Certbot
Si otro servicio está usando el puerto 80, Certbot no podrá verificarse correctamente.
Solución:
- Ver qué servicio está usando el puerto con:
sudo netstat -tulnp | grep :80
- Detener el servicio temporalmente y volver a ejecutar Certbot.
🔴 Too many requests al intentar generar el certificado
Let's Encrypt tiene límites de peticiones para evitar abuso.
Solución:
- Esperar unos minutos e intentarlo de nuevo.
- Usar
--stagingpara probar antes de solicitar un certificado real.
🔴 SSL_ERROR_RX_RECORD_TOO_LONG al acceder por HTTPS
Este error suele ocurrir cuando Nginx no está configurado correctamente para usar el certificado SSL.
Solución:
- Verificar que el bloque de configuración de Nginx incluye:
ssl_certificate /etc/letsencrypt/live/mi-dominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mi-dominio.com/privkey.pem;
- Reiniciar Nginx después de cualquier cambio con:
sudo systemctl restart nginx

💡 Aprendizajes del proceso
Y como siempre...
Aquí van mis aprendizajes:
🔹 HTTPS no es opcional en producción
Sin HTTPS, los datos viajan sin cifrar, los navegadores alertan a los usuarios y Google penaliza tu web.
Así que no hay excusa para no activarlo.
🔹 Let's Encrypt es gratuito y fácil de usar
Antes, obtener un certificado SSL costaba dinero y era complicado de instalar.
Ahora, con Let's Encrypt y Certbot, lo puedes hacer en minutos.
🔹 La automatización evita problemas futuros
Si no programas la renovación automática, el certificado expirará sin que te des cuenta.
Automatizar con cron jobs es la clave.
🔹 Nginx es clave para una configuración segura
Sin Nginx, no puedes gestionar correctamente las redirecciones y el tráfico HTTPS de forma eficiente.
🚀 Próximos Pasos
Ahora que la aplicación está funcionando de forma segura con HTTPS, el siguiente paso es optimizar el rendimiento de Flask con caching y compresión en Nginx. 🚀
➡️ ¿Has tenido problemas al configurar HTTPS con Let's Encrypt?
Cuéntame tu experiencia.
Si quieres conocer otros artículos parecidos a Habilitar HTTPS en Flask con Let's Encrypt y Nginx - Episodio 19 puedes visitar la categoría Proyecto-IA.

Deja una respuesta