本地密码管理器-Vaultwarden

之前主要使用lastpass,目前是浏览器端免费,其它都要收费,而且密码存在别人服务器总是不放心。

所以我们要本地部署vaultwarden并且可以在各种Bitwarden正常使用。这里使用vaultwarden是因为相比原生更加轻量,占用资源极少。

部署

环境准备​​

​​服务器要求​​:腾讯云服务器(1核2GB内存,Ubuntu/Debian系统)。

​​开放端口​​:80(HTTP)、443(HTTPS),通过腾讯云控制台配置安全组

注: 如果家里本身就有公网ip,或者只是本地玩玩,是不需要公网服务器的。我这里公网服务器资源紧张,用来做转发,实际服务部署到内网机,所以公网和内网交互需要内网穿透,我这里使用的是zerotier。

内网机部署

为了方便从云服务器转发到内网,所以通过nginx包一层,给vaultwarden套一个前缀,比如:/bitwarden。否则云服务nginx转发会很乱

yaml 复制代码
services:
nginx-proxy:
image: nginx:alpine
container_name: nginx-proxy
ports:
- "8000:80"    # 对外暴露 HTTPS 端口
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl   # 证书存储目录
networks:
- vaultwarden-net
depends_on:
- vaultwarden
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
networks:
- vaultwarden-net
volumes:
- ./vw-data/:/data/
expose:          # 仅内部暴露端口,nginx能访问即可
- "80"
- "3012"

# 自定义网络(实现容器间通信)
networks:
vaultwarden-net:
driver: bridge

挂载目录结构如下

bash 复制代码
vaultwarden/
├── docker-compose.yaml
└── volumes
├── nginx
│   ├── conf.d
│   │   └── default.conf
│   ├── ssl
│   │   ├── certificate.crt
│   │   └── private.key
│   └── uwsgi_params
└── vw-data

conf.d/default.conf配置

这里nginx.conf会默认引入所有conf.d/*.conf

bash 复制代码
server {
listen       80;
listen  [::]:80;
server_name  localhost;

return 301 https://$host$request_uri;  # 301 永久重定向

}

# HTTPS 主配置
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name localhost;

# SSL 证书配置(自签名示例,生产环境替换为 Let's Encrypt)
#ssl_certificate /etc/nginx/ssl/cert.pem;
#ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_certificate /etc/nginx/ssl/certificate.crt;
ssl_certificate_key /etc/nginx/ssl/private.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

# 静态文件服务(可选)
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

# Vaultwarden 代理配置(核心修正)
location /bitwarden/ {
proxy_pass http://vaultwarden/;  # 末尾斜杠确保移除路径前缀
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;

# 解决路径前缀导致的资源加载问题
proxy_redirect off;
sub_filter_once off;
sub_filter_types *;
sub_filter 'href="/' 'href="/bitwarden/';
sub_filter 'src="/' 'src="/bitwarden/';
}

# WebSocket 支持(实时同步), 自 v1.31.0 起,已移除对 3012 端口 WebSocket 流量的支持,因为它已集成至主 HTTP 端口。
location /bitwarden/notifications/hub {
proxy_pass http://vaultwarden:3012;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

# 错误页面配置(保持原样)
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

配置自签名证书

bash 复制代码
# 在docker-compose同级目录执行
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout ./volumes/nginx/ssl/private.key \
-out ./volumes/nginx/ssl/certificate.crt

服务启动

bash 复制代码
docker-compose up -d

测试访问

bash 复制代码
https://10.241.189.234:8443/bitwarden

公网ECS配置nginx(无域名)

bash 复制代码
cd /etc/nginx/conf.d

# 增加 234-proxy-443.conf, 这里一定要注意,把nginx.conf中server啥的都干掉,避免影响。

[root@VM-8-12-centos conf.d]# cat 234-proxy-443.conf
server {
listen 443 ssl;
server_name 替换为你的公网域名或IP;  # 替换为你的公网域名或IP

# SSL 证书配置(必须使用有效证书,如 Let's Encrypt)
# ssl_certificate /etc/letsencrypt/live/your-public-domain.com/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/your-public-domain.com/privkey.pem;
ssl_certificate /etc/nginx/ssl/certificate.crt;
ssl_certificate_key /etc/nginx/ssl/private.key;


# 反向代理到内网服务
location /bitwarden {
proxy_pass https://10.241.189.234:8443;
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;

# 信任内网服务的自签名证书(可选)
proxy_ssl_verify off;
}

# 其他安全头配置
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
}

nginx -s reload

测试

bash 复制代码
https://ECS公网IP/bitwarden

# 这种方式配置后,在浏览器可以直接使用,包括插件。但是会提示证书不安全,手机端除非手动能安装自建证书,否则无法直接使用。

公网ECS配置nginx(有域名)

以腾讯ECS为例

域名配置

根据官方提示,将域名绑定到ECS机器

进行域名备案

调整nginx配置

使用免费或者付费的ssl证书,下载后替换nginx中配置的证书信息

bash 复制代码
# SSL 证书配置(必须使用有效证书)
ssl_certificate /etc/nginx/ssl/自己的域名.crt;
ssl_certificate_key /etc/nginx/ssl/自己的域名.xyz.key;

客户端配置

  1. 下载安装bitwarden相关客户端,包括app端,浏览器插件等
  2. 配置为自托管,然后按照自己设置的用户密码登录即可

备份

找一个自己觉得安全的地方备份自己的挂载(volumes目录),比如NAS或者网盘,U盘等

问题处理

console-log.service.ts:53 Unhandled error in angular Error: Could not instantiate WebCryptoFunctionService. Could not locate Subtle crypto.

分析处理

必须使用https访问,否则报错

安卓客户端无法访问,提示无法验证服务器证书

分析处理

这个真得有域名了。

相关推荐
Code额1 小时前
Python 连接 DeepSeek API,OpenAI 对话方式总结
后端·python·ai·ai编程
星火10241 小时前
【LangChain4j系列10】Guardrails 安全护栏
人工智能·后端
四千岁1 小时前
稀疏向量BM25Retriever不支持中文怎么办?jieba来帮忙
前端·javascript·后端
用户6919026813391 小时前
Docker基本概念
后端·docker·容器
颜进强1 小时前
14 - OpenSpec 老页面改造骨架:定位 + 增量 + 回归三件套
前端·后端·ai编程
唐青枫1 小时前
别只把 switch 当成多路 if:Zig 模式匹配、状态机与 Tagged Union 实战
后端
步行cgn1 小时前
MyBatis 错误 Result Maps collection does not contain value for ... 详解与解决方案
后端
用户250694921611 小时前
Cordis 从入门到实战:插件卸载后,别留下一地鸡毛
后端
SomeB1oody1 小时前
【RustyML入门】5.3. 聚类指标
开发语言·后端·机器学习·rust·教程
IT_陈寒2 小时前
Vite打包给我挖的这个坑,差点搞崩我的项目
前端·人工智能·后端