Corregir Errores SSL de Subdominio www en Fly.io con Cloudflare (Error 525)

Fred· AI Engineer & Developer Educator6 min read

Desplegaste tu app en Fly.io y el dominio raiz funciona bien, pero www.tusitio.com da un error de handshake SSL? No estas solo. Este Error 525 ocurre porque Fly.io requiere certificados SSL separados para cada hostname—y la mayoria de guias de despliegue omiten completamente este paso.

Aqui esta la solucion, probada y verificada en un despliegue de produccion.

El Problema

Has desplegado en Fly.io, agregaste tu dominio personalizado, y todo se ve bien. Luego intentas visitar www.tusitio.com y obtienes:

Error 525: SSL handshake failed

Mientras tanto, tusitio.com (sin www) funciona perfecto. Que pasa?

Por Que Sucede Esto

Fly.io usa Let's Encrypt para aprovisionar certificados SSL, pero aqui esta el detalle: agregar un certificado para ejemplo.com NO cubre automaticamente www.ejemplo.com.

Son tratados como hostnames completamente separados. Necesitas agregar explicitamente un certificado para el subdominio www.

La Solucion (5 Pasos)

Paso 1: Instalar Fly.io CLI

Si aun no lo has hecho, instala flyctl:

# Instalar flyctl
curl -L https://fly.io/install.sh | sh

# Agregar al PATH
export FLYCTL_INSTALL="$HOME/.fly"
export PATH="$FLYCTL_INSTALL/bin:$PATH"

# Hacerlo permanente (agregar a ~/.bashrc o ~/.zshrc)
echo 'export FLYCTL_INSTALL="$HOME/.fly"' >> ~/.bashrc
echo 'export PATH="$FLYCTL_INSTALL/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

# Verificar que funciona
flyctl version

Paso 2: Verificar Tus Certificados Actuales

Primero, ve que certificados ya tienes:

flyctl certs list -a TU_NOMBRE_DE_APP

Probablemente veras algo como:

Host Name                 Added                Status
ejemplo.com              1 month ago          Ready
api.ejemplo.com          1 month ago          Ready

Notas lo que falta? El subdominio www.

Paso 3: Agregar el Certificado www (Esto Lo Arregla)

Aqui esta el comando critico que resuelve el problema:

flyctl certs add www.ejemplo.com -a TU_NOMBRE_DE_APP

Fly.io aprovisionara automaticamente un certificado SSL de Let's Encrypt para tu subdominio www. Veras una salida como:

You are creating a certificate for www.ejemplo.com
We are using Let's Encrypt for this certificate.

Your certificate for www.ejemplo.com is being issued.
You can validate your ownership of www.ejemplo.com by:

1: Adding an AAAA record to your DNS service which reads:
    AAAA @ 2a09:8280:1::X:XXXX

No te preocupes por la validacion DNS—si tu dominio raiz ya esta funcionando, el subdominio www se validara automaticamente.

Paso 4: Verificar que el Certificado Esta Listo

Espera 1-2 minutos, luego verifica el estado del certificado:

flyctl certs show www.ejemplo.com -a TU_NOMBRE_DE_APP

Busca "Status: Ready". Si dice "Awaiting certificates", espera otro minuto y verifica de nuevo.

Una vez listo, tu lista de certificados deberia mostrar:

flyctl certs list -a TU_NOMBRE_DE_APP
Host Name                 Added                Status
ejemplo.com              1 month ago          Ready
www.ejemplo.com          13 seconds ago       Ready

Perfecto.

Paso 5: Configurar el Modo SSL/TLS de Cloudflare

Este paso es critico si estas usando Cloudflare para DNS (como deberias).

  1. Inicia sesion en tu dashboard de Cloudflare
  2. Selecciona tu dominio
  3. Ve a SSL/TLSOverview
  4. Configura el modo de encriptacion a "Full" (no "Flexible" o "Full (strict)")

Por que "Full"?

  • Flexible: Cloudflare usa HTTPS hacia tus visitantes, pero HTTP hacia Fly.io (inseguro, causa problemas)
  • Full: Cloudflare usa HTTPS tanto hacia visitantes como hacia Fly.io (correcto)
  • Full (strict): Requiere una autoridad de certificados confiable, pero Fly.io gestiona sus propios certs (causa errores)

Configura Tus Registros DNS (Cloudflare)

Asegurate de que tus registros DNS estan configurados correctamente:

Dominio Raiz (ejemplo.com):

  • Tipo: A o AAAA
  • Nombre: @ (o dejar vacio)
  • Contenido: Tu direccion IP de Fly.io (de flyctl ips list)
  • Estado del proxy: Proxied (nube naranja habilitada)

Subdominio www (www.ejemplo.com):

  • Tipo: CNAME
  • Nombre: www
  • Target: ejemplo.com (apunta al dominio raiz)
  • Estado del proxy: Proxied (nube naranja habilitada)

La nube naranja (Proxied) es importante—enruta el trafico a traves del CDN de Cloudflare y habilita SSL.

Probar Todo

Verifica que ambos dominios funcionen:

# Probar dominio raiz
curl -I https://ejemplo.com

# Probar subdominio www
curl -I https://www.ejemplo.com

Ambos deberian retornar HTTP/2 200 (o HTTP/1.1 200). Si obtienes errores, ve la seccion de solucion de problemas abajo.

Errores Comunes y Soluciones

Error 525: SSL Handshake Failed

Sintomas: El subdominio www da Error 525, el dominio raiz funciona bien

Causas:

  1. Falta el certificado www en Fly.io
  2. El modo SSL/TLS de Cloudflare esta configurado a "Flexible" o "Full (strict)"

Solucion:

# Agregar el certificado www
flyctl certs add www.ejemplo.com -a TU_NOMBRE_DE_APP

# Esperar 2 minutos para la emision del certificado
sleep 120

# Verificar que esta listo
flyctl certs show www.ejemplo.com -a TU_NOMBRE_DE_APP

Tambien verifica que el modo SSL/TLS de Cloudflare este configurado a "Full".

El Subdominio www Retorna Timeout de Conexion

Sintomas: El subdominio www no carga para nada, sin pagina de error

Causas:

  1. Registro DNS CNAME faltante o incorrecto
  2. DNS no proxied a traves de Cloudflare
  3. Propagacion DNS incompleta

Solucion:

  1. Verifica tu configuracion DNS de Cloudflare para el registro CNAME www
  2. Asegurate de que la nube naranja (Proxied) este habilitada
  3. Espera 5-15 minutos para propagacion DNS
  4. Limpia el cache de tu navegador o prueba en modo incognito/privado

Por Que Importan los Certificados Separados

En hosting compartido tradicional, un certificado SSL comodin (*.ejemplo.com) cubre todos los subdominios. Pero Fly.io aprovisiona certificados individualmente a traves de Let's Encrypt.

Esto te da mas control pero requiere configuracion explicita para cada subdominio:

  • ejemplo.com → necesita su propio certificado
  • www.ejemplo.com → necesita su propio certificado
  • api.ejemplo.com → necesita su propio certificado
  • blog.ejemplo.com → necesita su propio certificado

Ya entiendes la idea.

Mejores Practicas para Fly.io + Cloudflare

  1. Agrega certificados para todos los subdominios que planeas usar antes de ir a produccion
  2. Usa el modo SSL/TLS "Full" de Cloudflare para despliegues en Fly.io
  3. Habilita el proxy de Cloudflare (nube naranja) para CDN y proteccion DDoS
  4. Prueba ambas versiones www y no-www antes de anunciar tu sitio
  5. Configura redirecciones en tu app si quieres forzar una version sobre la otra

Comandos Utiles para Solucion de Problemas

# Listar todos los certificados para tu app
flyctl certs list -a TU_NOMBRE_DE_APP

# Ver informacion detallada para un certificado especifico
flyctl certs show www.ejemplo.com -a TU_NOMBRE_DE_APP

# Eliminar un certificado (si necesitas empezar de nuevo)
flyctl certs delete www.ejemplo.com -a TU_NOMBRE_DE_APP

# Verificar las direcciones IP de tu app
flyctl ips list -a TU_NOMBRE_DE_APP

# Verificar resolucion DNS
dig ejemplo.com
dig www.ejemplo.com

# Probar conexion SSL con salida detallada
curl -vI https://www.ejemplo.com

# Verificar estado de la app
flyctl status -a TU_NOMBRE_DE_APP

# Ver logs de la app (util para debugging)
flyctl logs -a TU_NOMBRE_DE_APP

Conclusion

El problema de SSL de subdominio www en Fly.io es una de esas "trampas" que atrapan incluso a desarrolladores experimentados. La solucion es simple una vez que la conoces:

  1. Agrega un certificado separado para www: flyctl certs add www.ejemplo.com -a TU_NOMBRE_DE_APP
  2. Configura SSL/TLS de Cloudflare a modo "Full"
  3. Espera 1-2 minutos para que el certificado este listo
  4. Prueba ambos dominios

Eso es todo. Sin configuracion compleja, sin reinicios de servidor, sin editar archivos de configuracion. Solo un comando que la mayoria de guias de despliegue olvidan mencionar.

Ahora tus usuarios pueden acceder a tu sitio con o sin www, y ambos funcionaran correctamente.


Guias relacionadas:

Recursos:

Fred

Fred

AUTHOR

Full-stack developer with 10+ years building production applications. I've been deploying to Cloudflare's edge network since Workers launched in 2017.

Need a developer who gets it?

POC builds, vibe-coded fixes, and real engineering. Let's talk.

Hire Me →