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

HTTPS for a Flask application using Let's Encrypt and Nginx

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é. 🚀🔐

Índice
  1. 🚀 ¿Por qué necesito HTTPS en mi aplicación Flask? 📅 Diario de un SaaS
    1. 🔴 ¿Qué riesgos hay al no usar HTTPS?
  2. 🔍 Problema: Servir Flask con Nginx sin HTTPS
  3. 🛠️ Instalación de Let's Encrypt y Generación del Certificado
    1. ✅ 1. Instalar Certbot (Let's Encrypt)
    2. ✅ 2. Generar el Certificado SSL
  4. 🔧 Configuración de Nginx para Forzar HTTPS
    1. ✅ 3. Redirigir HTTP a HTTPS
    2. ✅ 4. Reiniciar Nginx para aplicar los cambios
  5. 🔄 Automatización de la Renovación del Certificado
    1. ✅ 5. Configurar la renovación automática
  6. ❌ Errores encontrados y cómo los solucioné
    1. 🔴 Could not bind to port 80 al ejecutar Certbot
    2. 🔴 Too many requests al intentar generar el certificado
    3. 🔴 SSL_ERROR_RX_RECORD_TOO_LONG al acceder por HTTPS
  7. 💡 Aprendizajes del proceso
    1. 🔹 HTTPS no es opcional en producción
    2. 🔹 Let's Encrypt es gratuito y fácil de usar
    3. 🔹 La automatización evita problemas futuros
    4. 🔹 Nginx es clave para una configuración segura
  8. 🚀 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:

  1. Ver qué servicio está usando el puerto con:
sudo netstat -tulnp | grep :80
  1. 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 --staging para 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:

  1. 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;
  1. Reiniciar Nginx después de cualquier cambio con:
sudo systemctl restart nginx

HTTPS for a Flask application using Let's Encrypt and 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

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir