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 failedMientras 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 versionPaso 2: Verificar Tus Certificados Actuales
Primero, ve que certificados ya tienes:
flyctl certs list -a TU_NOMBRE_DE_APPProbablemente veras algo como:
Host Name Added Status
ejemplo.com 1 month ago Ready
api.ejemplo.com 1 month ago ReadyNotas 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_APPFly.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:XXXXNo 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_APPBusca "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_APPHost Name Added Status
ejemplo.com 1 month ago Ready
www.ejemplo.com 13 seconds ago ReadyPerfecto.
Paso 5: Configurar el Modo SSL/TLS de Cloudflare
Este paso es critico si estas usando Cloudflare para DNS (como deberias).
- Inicia sesion en tu dashboard de Cloudflare
- Selecciona tu dominio
- Ve a SSL/TLS → Overview
- 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:
AoAAAA - 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.comAmbos 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:
- Falta el certificado www en Fly.io
- 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_APPTambien 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:
- Registro DNS CNAME faltante o incorrecto
- DNS no proxied a traves de Cloudflare
- Propagacion DNS incompleta
Solucion:
- Verifica tu configuracion DNS de Cloudflare para el registro CNAME www
- Asegurate de que la nube naranja (Proxied) este habilitada
- Espera 5-15 minutos para propagacion DNS
- 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 certificadowww.ejemplo.com→ necesita su propio certificadoapi.ejemplo.com→ necesita su propio certificadoblog.ejemplo.com→ necesita su propio certificado
Ya entiendes la idea.
Mejores Practicas para Fly.io + Cloudflare
- Agrega certificados para todos los subdominios que planeas usar antes de ir a produccion
- Usa el modo SSL/TLS "Full" de Cloudflare para despliegues en Fly.io
- Habilita el proxy de Cloudflare (nube naranja) para CDN y proteccion DDoS
- Prueba ambas versiones www y no-www antes de anunciar tu sitio
- 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_APPConclusion
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:
- Agrega un certificado separado para www:
flyctl certs add www.ejemplo.com -a TU_NOMBRE_DE_APP - Configura SSL/TLS de Cloudflare a modo "Full"
- Espera 1-2 minutos para que el certificado este listo
- 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:
- Guia Completa: Desplegar Proyectos Lovable a Cloudflare
- Desplegar Apps de Claude Code y Codex a Cloudflare
- Guia de Despliegue de Cloudflare Workers
Recursos:
Fred
AUTHORFull-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 →
