|

HTTPS sin puerto 80: Traefik + Let’s Encrypt DNS

Si tu ISP bloquea el puerto 80 (algo habitual en conexiones residenciales), el desafío DNS Let’s Encrypt con Traefik es la única forma de conseguir certificados SSL válidos sin pelear con tu proveedor de internet. La validación DNS-01 verifica que controlás el dominio creando un registro TXT en Route 53, sin necesidad de que Let’s Encrypt llegue a tu servidor.

En 30 segundos

  • HTTP-01 falla cuando tu ISP bloquea el puerto 80 — problema clásico en redes residenciales con Jellyfin, Home Assistant o blogs personales.
  • DNS-01 valida el dominio por registros TXT en DNS (puerto 53), que casi nunca está bloqueado.
  • Traefik usa Lego internamente para ACME, con soporte nativo para Route 53 vía variables de entorno AWS.
  • Solo DNS-01 permite certificados wildcard (*.tudominio.com) — HTTP-01 no lo soporta.
  • La configuración requiere credenciales IAM de AWS con permiso route53:ChangeResourceRecordSets en la zona correspondiente.

El problema: ISPs bloqueando puerto 80

Ponele que armaste un servidor en casa con Docker. Tenés Jellyfin para la familia, Home Assistant para la domótica, quizás un blog personal. Querés HTTPS y Let’s Encrypt es la opción obvia. Configurás Traefik, agregás las labels, y el certificado… no llega nunca.

El flujo de HTTP-01 (el método estándar) según la documentación oficial de Let’s Encrypt es simple: sus servidores intentan acceder a un archivo en /.well-known/acme-challenge/ de tu servidor, vía HTTP en el puerto 80. Si ese acceso funciona, el dominio es tuyo y te mandan el certificado.

El problema es que los ISPs residenciales bloquean conexiones entrantes en puertos bajos, especialmente el 80 y el 443. No es un error de configuración tuyo. Es una política del proveedor, y no hay mucho que hacer salvo conseguir un plan empresarial o buscar otra forma de validar.

Ahí entra DNS-01.

¿Qué es el desafío DNS-01?

El desafío DNS-01 de Let’s Encrypt es un método de validación ACME alternativo que demuestra control sobre un dominio sin requerir conexiones HTTP entrantes. En vez de servir un archivo, el cliente ACME crea un registro TXT en el DNS del dominio con un valor específico que Let’s Encrypt verifica mediante consultas DNS estándar (puerto 53).

El flujo completo funciona así: Traefik (usando Lego internamente) recibe la solicitud de certificado, contacta la API de Route 53, crea un registro TXT en _acme-challenge.tudominio.com con el valor que Let’s Encrypt espera, espera que la propagación DNS se complete, y entonces Let’s Encrypt hace la consulta DNS, verifica el registro, y emite el certificado. Todo automatizado, sin intervención manual. Complementá con automatizar renovaciones de certificados en CI/CD.

Como la validación pasa por DNS y no por HTTP, el puerto 80 bloqueado por tu ISP no interfiere en absoluto. Según el análisis publicado en Dev.to en mayo de 2026, este es el método preferido para cualquier instalación self-hosted en redes residenciales.

DNS-01 vs HTTP-01: cuándo usar cada uno

Antes de meterte con la configuración, conviene tener claro cuándo va cada uno.

CaracterísticaHTTP-01DNS-01
Requiere puerto 80 abiertoNo
Soporta wildcard (*.dominio.com)No
Requiere API en proveedor DNSNo
Complejidad de configuraciónBajaMedia
Tiempo de validaciónSegundos30-120 segundos (propagación DNS)
Ideal paraServidores con IP pública y puerto 80 libreRedes residenciales, servicios internos, wildcard
desafío dns let's encrypt traefik diagrama explicativo

La regla práctica: si tenés acceso público con puerto 80 disponible, HTTP-01 es más simple. Si estás en casa, en una red privada, o necesitás un wildcard para cubrir múltiples subdominios, DNS-01 es el camino.

Ojo: DNS-01 exige que tu proveedor DNS tenga una API que el cliente ACME pueda usar para crear y borrar registros automáticamente. Route 53 la tiene, y Traefik/Lego la soportan de forma nativa.

Configuración de Traefik con ACME y DNS challenge

Traefik maneja los certificados ACME vía Lego, una librería Go que implementa el protocolo y tiene soporte para decenas de proveedores DNS. La configuración central va en el archivo estático de Traefik (o en las variables de entorno si usás Docker).

Los parámetros clave son:

  • certificatesresolvers: nombre del resolver que vas a referenciar en los servicios
  • acme.dnschallenge.provider: el proveedor DNS, en este caso route53
  • acme.email: tu email (Let’s Encrypt manda alertas de renovación acá)
  • acme.dnschallenge.delayBeforeCheck: segundos de espera antes de que Let’s Encrypt valide (necesario para dar tiempo a la propagación DNS)
  • acme.storage: ruta al archivo acme.json donde se guardan los certificados

El delayBeforeCheck es el parámetro que más gente olvida y después se pregunta por qué falla la validación. Route 53 es relativamente rápido propagando (generalmente menos de 30 segundos), pero en redes con DNS caché agresiva podés necesitar 60-120 segundos. Si estás empezando, poné 60 y ajustá si ves que falla.

Integración con AWS Route 53

Para que Traefik pueda crear registros en Route 53, necesitás credenciales AWS con los permisos adecuados. No hace falta una cuenta root ni permisos de administrador completo. Ya lo cubrimos antes en elegir herramientas de automatización para tu infraestructura.

El permiso mínimo necesario en la política IAM es route53:ChangeResourceRecordSets sobre la zona específica (podés restringirlo por ARN de zona para mayor seguridad), más route53:ListHostedZones y route53:GetChange para que Lego pueda verificar que el cambio se aplicó.

Las credenciales se pasan a Traefik vía variables de entorno:

  • AWS_ACCESS_KEY_ID: el Access Key ID del usuario IAM
  • AWS_SECRET_ACCESS_KEY: el Secret Access Key correspondiente
  • AWS_REGION: región de AWS (para Route 53 suele funcionar con us-east-1)
  • AWS_HOSTED_ZONE_ID: (opcional pero recomendado) el ID de la zona para evitar ambigüedades

¿Y qué hace Traefik con estas credenciales? Cuando un servicio necesita un certificado, Traefik llama a la API de Route 53 para crear el registro TXT temporal, espera el tiempo configurado en delayBeforeCheck, Let’s Encrypt valida, y después Traefik borra el registro. Todo limpio y automático.

Ejemplo paso a paso: Docker + Traefik + Let’s Encrypt

Acá va una configuración funcional con docker-compose. El servicio de Traefik tiene todo lo necesario, y los demás servicios solo necesitan las labels correctas para pedir certificados.

El docker-compose.yml para Traefik:

  • El volumen ./acme.json:/acme.json persiste los certificados entre reinicios (necesario, o Traefik pide uno nuevo cada vez que arranca y te comés los rate limits de Let’s Encrypt).
  • Las variables de entorno AWS van en el bloque environment o en un archivo .env excluido del repositorio.
  • El argumento --certificatesresolvers.myresolver.acme.dnschallenge=true habilita DNS-01 para ese resolver.
  • El argumento --certificatesresolvers.myresolver.acme.dnschallenge.provider=route53 le dice a Lego qué proveedor usar.

En cualquier otro servicio de Docker que quieras exponer con HTTPS, agregás estas labels:

  • traefik.enable=true
  • traefik.http.routers.miservicio.rule=Host(\`miservicio.tudominio.com\`)
  • traefik.http.routers.miservicio.entrypoints=websecure
  • traefik.http.routers.miservicio.tls.certresolver=myresolver

Con eso, Traefik detecta el contenedor, solicita el certificado automáticamente usando DNS-01 con Route 53, y el servicio queda disponible con HTTPS. En el primer inicio puede tardar hasta 2 minutos mientras propaga el DNS. Después, las renovaciones (cada 60 días antes del vencimiento, según la política de Let’s Encrypt) son silenciosas. Cubrimos ese tema en detalle en HTTPS correcto en sitios multi-idioma.

Si estás evaluando en qué infraestructura alojar tu setup de producción, donweb.com ofrece VPS con IPs fijas dedicadas, lo que simplifica bastante la configuración de registros DNS para este tipo de setups.

Casos de uso reales: Jellyfin, Home Assistant y más

Jellyfin en casa sin HTTPS significa que los clientes de iOS y Android se quejan, las apps de terceros fallan, y si querés acceder desde afuera necesitás ignorar warnings de seguridad constantemente. Con DNS-01 y un wildcard, podés tener jellyfin.tudominio.com, homeassistant.tudominio.com, nextcloud.tudominio.com, todos con certificados válidos, sin abrir el puerto 80.

El wildcard es el otro gran caso de uso. Con HTTP-01 necesitás un certificado por cada subdominio. Con DNS-01 pedís *.tudominio.com y cubre todos los subdominios actuales y futuros de un saque (que no es poco, si después agregás servicios).

Errores comunes y cómo solucionarlos

El registro TXT se crea pero la validación falla

Casi siempre es el delayBeforeCheck insuficiente. Verificá con dig TXT _acme-challenge.tudominio.com que el registro existe antes de que Let’s Encrypt valide. Si el registro aparece en dig pero la validación falla, probá aumentar el delay a 120 segundos.

Error “AccessDenied” de AWS

La política IAM no tiene los permisos necesarios, o las credenciales están mal. Revisá que el usuario tenga route53:ChangeResourceRecordSets, route53:ListHostedZones y route53:GetChange. Si usás AWS_HOSTED_ZONE_ID, verificá que el ID corresponde a la zona correcta (empieza con Z seguido de caracteres alfanuméricos).

Rate limit de Let’s Encrypt

Let’s Encrypt limita a 5 certificados por dominio registrado por semana. Si estás probando la configuración y fallás varias veces seguidas, podés agotar el límite. Para testing, configurá el servidor de staging: --certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory. Los certificados de staging no son válidos para producción, pero te permiten verificar que todo el flujo funciona sin consumir el límite. Relacionado: ejecutar tus servicios sin dependencias externas.

El archivo acme.json pierde los certificados

Si no le ponés permisos 600 al archivo, Traefik lo rechaza. Antes de iniciar el stack, creá el archivo con touch acme.json && chmod 600 acme.json. En Windows con Docker Desktop, esto se maneja diferente dependiendo de si usás WSL2 o Hyper-V.

Preguntas Frecuentes

¿Cómo configurar Traefik con DNS-01 challenge en AWS Route 53?

Necesitás tres cosas: configurar el resolver ACME en Traefik con dnschallenge.provider=route53, proveer las credenciales AWS vía variables de entorno (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY), y asegurarte que el usuario IAM tenga permisos sobre la zona de Route 53. Después, cada servicio Docker usa la label tls.certresolver=nombre-del-resolver para pedir su certificado automáticamente.

¿Cuál es la diferencia entre HTTP-01 y DNS-01 en Let’s Encrypt?

HTTP-01 verifica que controlás el dominio sirviendo un archivo vía HTTP en el puerto 80. DNS-01 verifica el control creando un registro TXT en el DNS del dominio. La diferencia práctica: HTTP-01 requiere puerto 80 accesible desde internet, DNS-01 no. Solo DNS-01 soporta certificados wildcard.

¿Cómo automatizar certificados SSL si mi ISP bloquea el puerto 80?

Usás DNS-01 con un proveedor DNS que tenga API (como Route 53, Cloudflare, o similares). El cliente ACME (en este caso Lego, que Traefik usa internamente) crea y borra registros DNS automáticamente en tu nombre. No hay intervención manual y las renovaciones también son automáticas cada 60 días.

¿Cómo generar certificados wildcard con Let’s Encrypt y Traefik?

En la configuración del resolver, usás tls.domains.main=tudominio.com y tls.domains.sans=*.tudominio.com. Let’s Encrypt solo emite wildcards vía DNS-01, así que el resolver tiene que tener configurado el DNS challenge con tu proveedor DNS. El certificado resultante cubre cualquier subdominio de primer nivel de tu dominio.

¿Qué permisos IAM necesita el usuario de AWS para DNS-01 con Route 53?

El mínimo necesario son tres acciones: route53:ChangeResourceRecordSets (para crear/borrar el TXT de validación), route53:ListHostedZones (para encontrar la zona correcta), y route53:GetChange (para verificar que el cambio se propagó). Podés restringir ChangeResourceRecordSets solo al ARN de tu zona específica para reducir el blast radius si las credenciales se comprometen.

Conclusión

El desafío DNS-01 con Traefik y Route 53 resuelve un problema real que tiene mucha gente con setups self-hosted en casa: el puerto 80 bloqueado deja sin opciones a HTTP-01, y sin certificados válidos el HTTPS es una promesa vacía. La configuración tiene su complejidad (credenciales IAM, propagación DNS, el archivo acme.json) pero una vez que funciona, es completamente autónoma.

Si estás armando algo con múltiples subdominios, el wildcard solo ya justifica el cambio. Un certificado para *.tudominio.com y todos los servicios nuevos que agregues quedan cubiertos sin tocar nada. Las renovaciones automáticas cada 60 días no requieren intervención. La documentación oficial de Traefik tiene los ejemplos base, y desde ahí es cuestión de ajustar las variables de entorno AWS y el delayBeforeCheck según tu setup.

Fuentes

Te puede interesar...