Tu propio gestor de contraseñas en casa, con HTTPS y sin abrir puertos (Vaultwarden + Tailscale)
Cómo monté Vaultwarden en una Raspberry Pi para usarlo con las apps de Bitwarden, con certificado HTTPS real gracias a Tailscale Serve y sin exponer nada a Internet.
Llevaba tiempo queriendo dejar de depender de un gestor de contraseñas en la nube de otro. Vaultwarden es una versión ligera y libre del servidor de Bitwarden: funciona con las apps oficiales de Bitwarden (móvil, navegador, escritorio) y cabe de sobra en una Raspberry Pi.
El reto no es instalarlo, que son cinco líneas. El reto es hacerlo seguro: tus contraseñas no pueden quedar expuestas a Internet, y a la vez tienes que poder usarlas desde el móvil fuera de casa.
El problema del HTTPS
Vaultwarden necesita HTTPS. No es por capricho: tus contraseñas se cifran y descifran en tu dispositivo, y los navegadores solo permiten esas funciones criptográficas en páginas seguras. Por HTTP, la web directamente no funciona.
Las opciones típicas para tener HTTPS en casa son:
- Comprar un dominio, abrir el puerto 443 y montar un proxy inverso con Let’s Encrypt. Funciona, pero expones tu gestor de contraseñas a Internet.
- Un certificado autofirmado. Las apps se quejan y es incómodo.
- Tailscale Serve. Es la que elegí.
Qué es Tailscale y por qué encaja aquí
Tailscale crea una red privada entre tus dispositivos (el móvil, el PC, la Pi) usando WireGuard por debajo. Cada máquina recibe un nombre dentro de tu red privada, del tipo mi-pi.tu-red.ts.net.
Y lo importante: con Tailscale Serve, Tailscale le consigue a ese nombre un certificado HTTPS real (de Let’s Encrypt) y lo renueva solo. El servicio solo es accesible desde tus dispositivos conectados a Tailscale. Desde Internet, no existe.
Paso 1: Vaultwarden en Docker, escuchando solo en local
En mi docker-compose.yml:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://mi-pi.tu-red.ts.net:8443"
SIGNUPS_ALLOWED: "true" # solo mientras creas tu cuenta
SHOW_PASSWORD_HINT: "false"
TZ: Europe/Madrid
ports: ["127.0.0.1:8222:80"]
volumes: [./vaultwarden:/data]
La clave es 127.0.0.1:8222:80. El contenedor solo es accesible desde la propia Pi, ni siquiera desde el resto de la red de casa. La única puerta de entrada será Tailscale.
docker compose up -d vaultwarden
Paso 2: publicarlo con Tailscale Serve
Con Tailscale ya instalado en la Pi y con HTTPS activado en el panel de Tailscale (en la sección DNS):
sudo tailscale serve --bg --https=8443 http://127.0.0.1:8222
Esto dice: «en el puerto 8443, con HTTPS, reenvía a Vaultwarden». Compruébalo con:
tailscale serve status
Uso el 8443 porque el 443 ya lo tengo ocupado con otra app. Si lo tienes libre, puedes usar el normal.
Paso 3: crea tu cuenta y cierra la puerta
Desde un dispositivo con Tailscale, abre https://mi-pi.tu-red.ts.net:8443, crea tu cuenta con una contraseña maestra larga y apúntala en papel en un sitio seguro. Si la pierdes, nadie puede recuperar tus contraseñas, ni tú.
Después, desactiva el registro:
SIGNUPS_ALLOWED: "false"
docker compose up -d vaultwarden
Ahora nadie más puede crearse una cuenta en tu servidor.
Paso 4: conecta las apps de Bitwarden
En la app de Bitwarden del móvil o la extensión del navegador, antes de iniciar sesión elige servidor autoalojado y pon tu dirección https://mi-pi.tu-red.ts.net:8443. El dispositivo tiene que tener Tailscale activado.
Un detalle práctico: las apps guardan una copia cifrada de tu caja fuerte. Si un día estás sin Tailscale, puedes consultar tus contraseñas igualmente; solo no se sincronizan los cambios hasta que vuelvas a conectar.
Paso 5: copias de seguridad (no te lo saltes)
Un gestor de contraseñas sin copias es una bomba de relojería. Vaultwarden trae un comando para hacer una copia consistente de su base de datos:
docker exec vaultwarden /vaultwarden backup
Deja un archivo db_FECHA.sqlite3 en su carpeta de datos. Lo lanzo cada noche antes de mi copia al NAS, y borro los de más de 7 días. Además, de vez en cuando exporto la caja fuerte cifrada desde la web.
Resumen
- Vaultwarden solo escucha en
127.0.0.1. - Tailscale Serve le pone HTTPS real y lo hace accesible solo a mis dispositivos.
- Registro cerrado después de crear la cuenta.
- Copia de la base de datos cada noche.
Cero puertos abiertos en el router. Es la configuración con la que duermo tranquilo.
¿Te has quedado con la idea?
Tres preguntas rápidas. Cada acierto suma 10 XP.