Seguramente tengas una Raspberry o un mini-servidor en casa y te hayas animado a montar un par de servicios como Home Assistant o Guacamole (entre otros), que te facilitan un poco la vida. Vamos a ver cómo acceder a ellos localmente con dominio y SSL 🙂

Personalmente, hay servicios que no me gusta exponer a internet. Antes accedía a todos por IP, pero en cuanto vas acumulando servicios te das cuenta de que:

  • No puedes memorizar todos los puertos.
  • Es incómodo estar poniendo puertos.

La solución temporal

Mi solución temporal fue crear una zona local en mi dominio (local.dominio.tld), aprovechando el DNS local que uso para AD. Gracias a esto, y usando NGINX, puedo usar virtual hosting y exponer servicios a mi red local de forma fácil: en vez de 192.168.1.233:8123 para acceder a Home Assistant, ahora pongo hass.dominio.tld y me lleva directamente al login. Un lujo, ¿eh?

Estuve un tiempo así y luego pensé: oye, ¿y si le pongo SSL a esto? Es más seguro y, para mi gusto, queda mejor acceder por HTTPS. Así que vamos a montarlo, ¿no?

La solución definitiva

¿Qué necesitamos?

Poca cosa:

  • Servicios que exponer (idealmente configurados con virtual hosting, como indico arriba).
  • Un servidor web local (en mi caso NGINX, sobre Ubuntu Server).
  • Un servidor DNS local (o tendremos que actualizar el archivo hosts de cada máquina).
  • Un dominio público en propiedad, en el que podamos añadir un registro TXT para verificar el certificado.

Primer paso: crear los registros DNS y el virtual host

Damos por hecho que ya tenemos un servidor DNS montado y que nuestra máquina lo usa para resolver. Hay que crear un registro A que apunte al servidor web que vayamos a usar, por ejemplo:

NombreTipoValor
zabbixA192.168.1.230

Una vez creado, si accedemos a zabbix.dominio.tld (sustituyendo dominio.tld por nuestro dominio), deberíamos llegar a nuestro servidor web. Paso completado.

Segundo paso: obtener el certificado SSL

Para obtener el certificado usaremos Let’s Encrypt, una CA gratuita que usan miles de sitios. Pediremos un certificado wildcard: todo lo que cuelgue de *.dominio.tld podrá usarlo.

¡Ojo! El wildcard cubre un solo nivel: vale para zabbix.dominio.tld, pero no para algo.zabbix.dominio.tld.

Para obtenerlo hay que instalar Certbot:

sudo apt install certbot python3-certbot-nginx

Una vez instalado, y comprobado que el virtual hosting funciona, ejecutamos:

sudo certbot certonly \
  --agree-tos \
  --email [email protected] \
  --manual \
  --preferred-challenges=dns \
  -d '*.example.com' \
  --server https://acme-v02.api.letsencrypt.org/directory

Cambiando *.example.com por nuestro dominio, Certbot nos pedirá algo así:

Please deploy a DNS TXT record under the name:

_acme-challenge.example.com.

with the following value:

<valor-aleatorio>

Press Enter to Continue

Añadimos un registro TXT con ese nombre y valor en nuestro dominio público, pulsamos Enter y debería generarnos el certificado.

Solo nos queda configurar el certificado en el servidor web, habilitar el puerto 443 y ya lo tenemos todo servido por HTTPS.