Vaultwarden(原名 Bitwarden_RS)是一个非官方的、使用 Rust 编写的 Bitwarden 服务器端替代品。
介绍
核心特点
- 轻量级:相比官方的 C# 版服务器(需要 MSSQL,占用内存大),Vaultwarden 非常节省资源,甚至可以在树莓派或 512MB 内存的 VPS 上流畅运行。
- 全功能:它解锁了官方版通常需要付费的企业级功能,例如:组织/其享功能、附件上传、YubiKey/Duo 2FA 支持、TOTP 生成等。
- 兼容性:完全兼容官方的 Bitwarden 客户端(浏览器插件、iOS/Android App、桌面端)。
- 数据掌控:所有密码数据存储在你自己的服务器上,不依赖第三方云。
Bitwarden(及 Vaultwarden)的加密原理
Bitwarden(及 Vaultwarden)的加密原理可以简要概括为 零知识架构 (Zero-Knowledge Architecture) 和 端到端加密 (End-to-End Encryption)。
核心逻辑是:加密和解密只发生在你的设备上,服务器只负责存储加密后的乱码。
以下是 4 个关键步骤:
密钥派生 (Key Derivation)
当你输入 主密码 时,你的设备(手机/浏览器)会结合你的邮箱(作为盐 Salt),使用 PBKDF2 或 Argon2 算法进行数十万次哈希运算。
- 结果:生成一个 主密钥 (Master Key)。
- 注意:主密码和主密钥永远不会离开你的设备。
本地加密 (AES-256)
系统会随机生成一个 账户加密密钥。
- 加密数据:你的密码库数据(账号、密码、笔记)使用这个 账户加密密钥 进行 AES-256 位加密。
- 加密密钥:然后,这个 账户加密密钥 本身会被你的 主密钥 再次加密。
数据传输与存储
只有以下两样东西会被发送到服务端:
- 加密后的数据(一堆乱码)。
- 主密码的哈希值(仅用于验证身份登录,无法用于解密数据)。
服务器管理员看到的数据全是加密后的密文(Cipher Text),没有密钥无法破解。
数据共享 (RSA 非对称加密)
当你与他人共享密码时(组织功能):
- 使用 RSA 算法。
- 你用对方的 公钥 加密密码数据。
- 对方收到后,用只有他自己知道的 私钥 解密。
一句话总结:
你的主密码是唯一的钥匙,它只存在于你的脑海和设备内存中,服务端也是瞎子,完全不知道你存了什么。
部署前准备
在开始之前,你需要满足以下条件:
- 一台 Linux 服务器/VPS (Ubuntu/Debian/CentOS 等)。
- 已安装 Docker 和 Docker Compose。
- 一个域名 (强烈建议)。
- 反向代理与 HTTPS (强制要求):由于浏览器的安全限制(Web Crypto API),Bitwarden 客户端必须通过 HTTPS 连接。可以使用 Nginx, Caddy, 或 Nginx Proxy Manager (NPM)。
Docker Compose 部署步骤
下面将使用 Docker Compose 来管理容器,这样配置和维护都更方便。
第一步:创建目录
在服务器上创建一个文件夹来存放配置文件和数据:
mkdir -p /data/vaultwarden/vw-data/logs
cd /data/vaultwarden
第二步:生成 Admin Token (可选但推荐)
如果想启用后台管理页面(用于邀请用户、查看状态),需要生成一个 Token。
运行以下命令生成一个安全的随机字符串:
openssl rand -base64 48
# 推荐
docker run --rm -it vaultwarden/server:1.35.2 /vaultwarden hash
记下输出的字符串,稍后填入配置文件中。
第三步:编写 docker-compose.yml
- 创建并编辑
docker-compose.yml 文件
services:
vaultwarden:
image: vaultwarden/server:1.35.2
container_name: vaultwarden
# restart: always
restart: unless-stopped
ports:
- '8080:80'
- '3012:3012' # WebSocket 通知
volumes:
- ./vw-data:/data
environment:
# 域名配置 (对于某些功能如 WebAuthn 是必须的)
- DOMAIN=https://pass.yourdomain.com
# 注册控制: 建议初次部署设为 true,注册完自己账号后改为 false
- SIGNUPS_ALLOWED=true
# 启用 WebSocket 通知 (多端实时同步)
- WEBSOCKET_ENABLED=true
# 管理面板 Token (填入上一步生成的字符串)
# 如果不设置,默认无法访问 /admin 页面
- ADMIN_TOKEN=UFScxZejBFzoNKAzgdfZSmAw6TK4KZMK+l18N/ECS5ixlL5unZuZzrcYLRz//vhBqzuxBshVXmXYOd++w+yZP4R1/Ps9In/J0GsB41BFhufkheu6kh22TqrEXOyU4mbQR9HwdO6SqjxHAjpapsNrc7VAUinmZuBbEZu/gFrgp04=
# 日志设置
- LOG_FILE=/data/logs/vaultwarden.log
- LOG_LEVEL=warn
第四步:启动容器
配置反向代理 (HTTPS)
重要: 不能直接通过 http://ip:8080 使用 Vaultwarden 的大部分功能(包括注册和登录),必须配置 HTTPS。
使用 Nginx
在你的 Nginx 配置文件 (server 块) 中加入:
server {
listen 443 ssl http2;
server_name pass.yourdomain.com;
# SSL 证书路径配置...
# ssl_certificate ...
# ssl_certificate_key ...
location / {
proxy_pass http://127.0.0.1:8080; # 指向 Docker 端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# WebSocket 支持 (可选,但推荐)
location /notifications/hub {
proxy_pass http://127.0.0.1:3012;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /notifications/hub/negotiate {
proxy_pass http://127.0.0.1:8080;
}
}
使用 Nginx Proxy Manager
- 添加 Proxy Host。
- Domain Names:
pass.yourdomain.com
- Forward Hostname:
服务器IP 或 vaultwarden (如果在同一 Docker 网络)
- Forward Port:
8080
- SSL Tab: 申请 Let’s Encrypt 证书并勾选
Force SSL。
初始设置与安全加固
注册账号
访问你的域名 https://pass.yourdomain.com,点击 “Create Account” 注册你的主账号。
关闭注册 (重要安全措施)
一旦注册了自己的账号,强烈建议关闭新用户注册,防止陌生人利用你的服务器。
- 修改
docker-compose.yml:
- 重启容器:
docker compose down && docker compose up -d
注:即使关闭了注册,管理员依然可以通过 /admin 页面邀请家人或朋友加入。
访问管理面板
访问 https://pass.yourdomain.com/admin。
输入你在 docker-compose.yml 中设置的 ADMIN_TOKEN。
在这里你可以:
- 查看注册用户。
- 邀请新用户。
- 删除用户。
- 配置 SMTP 邮件服务(用于发送邀请邮件)。
客户端连接
- 下载官方 Bitwarden 客户端(App Store, Chrome Store 等)。
- chrome 插件:
Bitwarden 密码管理器
- 在登录页面,点击 设置 (Settings) 或 自托管 (Self-hosted) 图标。
- 在 服务器 URL (Server URL) 中输入你的域名:
https://pass.yourdomain.com。
- 保存并登录。
备份与维护
数据备份(核心):
Vaultwarden 的所有数据都在 ./vw-data 目录中,最重要的文件是 db.sqlite3 (数据库) 和 rsa_key* (密钥)。
建议定期将整个 /data/vaultwarden/vw-data 目录备份到异地(如 git、OSS、S3、NAS 或 Google Drive)。
更新容器:
cd /data/vaultwarden
docker compose pull
docker compose up -d