Los certificados SSL/TLS no son tan complicados una vez que los entiendes, a diferencia del DNS (que siempre es un dolor de cabeza), hacer que HTTPS funcione para servicios auto-alojados es en realidad bastante sencillo.

La mayoría de mis servicios de servidor doméstico corren como contenedores Podman accesibles a través de un gateway VPS con IP pública. Para acceder a esos servicios de forma segura desde cualquier lugar, todos deben estar detrás de HTTPS, lo que significa que tengo que usar certificados.



Certificados SSL/TLS

Cuando ves el ícono del candado en tu navegador web, un certificado TLS está haciendo 2 cosas: cifrando tu conexión para que nadie pueda leer el tráfico en tránsito, y verificando que el servidor con el que estás hablando es realmente quien dice ser.

padlock.webp

SSL (Secure Sockets Layer) es el nombre antiguo y obsoleto del protocolo que todos siguen usando por costumbre (y la verdad es que suena mejor). TLS (Transport Layer Security) es el protocolo actual vigente. Ambos nombres se usan generalmente de forma intercambiable, pero hoy en día TLS es el estándar.

Para entornos auto-alojados tienes 2 opciones. Usar una Autoridad de Certificación pública como Let’s Encrypt, que es gratuita, automatizada y de confianza para todos los navegadores, o montar tu propia CA privada para servicios internos, lo que te da más control pero es más complejo de configurar.

Para servicios auto-alojados, la Autoridad de Certificación preferida es Let’s Encrypt, que es gratuita, automatizada y de confianza para todos los navegadores de fábrica. La otra opción es montar tu propia CA privada, que te da más control pero es más compleja de configurar y mantener.



Mi Configuración

Soy partidario del KISS (Keep It Simple, Stupid). La topología se ve así:

Internet → VPS (Headscale + reenvío de puertos) → Tailscale VPN → Servidor Doméstico (Caddy + contenedores Podman)

Cloudflare gestiona el DNS, apuntando cada subdominio a la IP pública del VPS. El VPS corre Headscale para la coordinación de la VPN y reenvía el tráfico entrante en el puerto 443 a través del túnel Tailscale hacia el servidor doméstico. Caddy corre en el servidor doméstico, gestiona la terminación TLS y hace reverse proxy de las peticiones al contenedor correcto. Los servicios tienen sus propios subdominios, como auth.example.com, home.example.com, y así sucesivamente.

Como el servidor doméstico no es directamente accesible desde internet, Caddy no puede usar challenges HTTP-01 para Let’s Encrypt, ya que estos requieren que Let’s Encrypt se conecte de vuelta a tu servidor en el puerto 80. En su lugar, Caddy usa challenges DNS-01 a través de la API de Cloudflare, donde la propiedad del dominio se verifica mediante un registro TXT de DNS. Sin puertos expuestos.

Todo permanece protegido detrás de la VPN, y Caddy gestiona toda la administración de certificados de forma automática. Agregar un nuevo servicio es simplemente una nueva entrada en Caddy y un registro DNS en Cloudflare.



¿Por qué Caddy?

Caddy es el reverse proxy y gestor de certificados que corre en mi servidor doméstico. Me gusta más que otras opciones porque es muy directo y fácil de configurar.

Probé nginx y Traefik, pero aunque nginx funciona muy bien, requiere una configuración separada de certbot y configuración adicional, lo cual es excesivo para una configuración simple. Traefik tiene excelentes funcionalidades de orquestación de contenedores, pero añade una complejidad de configuración que no necesito para lo que es esencialmente un reverse proxy simple.

Caddy gestiona todo el ciclo de vida del certificado de forma automática. Como el servidor doméstico no es accesible públicamente, usa challenges DNS-01 con la API de Cloudflare en lugar de HTTP-01. Caddy crea un registro TXT temporal en Cloudflare para demostrar la propiedad del dominio, obtiene el certificado y luego elimina el registro.



Algunas Alternativas

Aquí hay algunas alternativas que vale la pena conocer:

Cloudflare Tunnels se salta el VPS por completo enrutando el tráfico a través de la red de Cloudflare. La configuración es extremadamente simple (sin VPS que gestionar) pero estás confiándole todo tu tráfico a Cloudflare.

Traefik con Docker/Podman vale la pena considerarlo si estás corriendo un gran número de servicios en contenedores y quieres descubrimiento automático de servicios mediante etiquetas de contenedor. Es más potente que Caddy, solo que más complejo de configurar.

nginx con certbot funciona muy bien y te da más control sobre cada aspecto de la gestión de certificados. Es una excelente opción para configuraciones complejas y control total.