威联通 NAS 配置 Bitwarden,不用再花钱购买证书啦

序言

Bitwarden 在心里种草好久了,毕竟把自家的密码放在自己家里能安心一点嘛(Keepass 是啥)

结果上网一翻教程嘿,还得花钱买 SSL 证书的,要不然就得在 Let's Encrypt 反复来回申请证书(关键是,还要一个域名,我可不想跑去备案…),给我整得差点弃坑不玩了

但是呢,种草的东西不弄一份怎么行呢?乖乖回来研究,结果部署过程中主要难度出在自签名证书这里了。当然,后续配置 WebSocket 服务之类的也花了一些工夫,但那倒是没什么关系啦

都搞好了以后,反而想买个域名了……所以下一步打算就是把服务器配置到固定的域名上,而不是像现在一样配置到 ip 上,这样等 ip 地址到期就不必重新配置一遍了

先是一个大致的目录,说明一下要做什么:

  1. (推荐)安装 Docker 版 Portainer,方便后期管理各 Docker 容器
  2. 生成自签名证书
  3. 申请一个邮箱(推荐 outlook),用来给 Bitwarden 的服务端发邮件用
  4. 安装 Docker 版 Bitwarden,即 vaultwarden/server
  5. 安装 nginx,做好 WebSocket 服务器相关的配置

Portainer

这段命令是从网上抄的,原文地址……忘了(其实如果不是为了备案,我也不会跑来写博客呢)

docker run -d -p 9000:9000 -name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /share/CACHEDEV1_DATA/Container/Docker/portainer_data:/data portainer/portainer

这里注意一下端口的设置,前面那个 9000 是服务器的端口,可以按需要修改,后边的 9000 就不要动了

还有就是,后面的映射路径

/share/CACHEDEV1_DATA/Container/Docker/portainer_data

可以按需要修改

生成自签名证书

这个……是从外面抄来的方案,我都不知道怎么做到的,但它就是能用哈哈哈

安装 OpenSSL

在 Windows 系统就可以了,下载 OpenSSL 的 Win64 版本,安装,配置环境变量

PATH: C:\Program Files\OpenSSL-Win64\bin

在 cmd 中敲 openssl 看一下配置成功没有

编写配置文件和脚本

把以下三个文件放到一个文件夹里:

server_rootCA.csr.cnf

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=CN
ST=A
L=A
O=A
OU=local_RootCA
emailAddress=.
CN = 服务器域名或ip地址

v3.ext

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
IP = 服务器域名或ip地址

do.bat

openssl genrsa -out server_rootCA.key 2048
openssl req -x509 -new -nodes -key server_rootCA.key -sha256 -days 36500 -out server_rootCA.pem
openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config server_rootCA.csr.cnf
openssl x509 -req -in server.csr -CA server_rootCA.pem -CAkey server_rootCA.key -CAcreateserial -out server.crt -days 36500 -sha256 -extfile v3.ext

运行脚本,生成证书

运行 do.bat,会要求输入一次信息,这里就随便编一个虚假的机构名就可以了(比如 MiaoMiaoMiao),不用填 ip 地址或者域名啥的

生成的文件有 5 个,server.crt 和 server.key 这俩是要拿给 Bitwarden 用的,留给下一步备用

server_rootCA.pem 复制到 Android 上,导入 CA 证书

server_rootCA.pem 重命名为.cer,在 Windows 上,导入受信任的根证书颁发机构

这样等下配置好的 Bitwarden 就可以和客户端通信了

安装 Bitwarden

到这就简单啦,跟着我的配置来吧

申请一个邮箱用来给 Bitwarden 发邮件用,outlook 的就很好

在 Container Station 里面选 Create,然后搜索 vaultwarden/server,点 Install

安装配置

文件夹映射

先配置一下映射的文件夹,把容器的/data 映射到随便什么地方就好了,比如,我的配置是:

左边/Container/bitwarden_data(这个文件夹你得先在 File Station 里面创建好),右边/data

环境变量

在环境变量选项卡中,加入以下这些环境变量:
env.png

其中,DOMAIN 这个就只有一个用处,就是系统给你发邮件的时候,它把这个变量写在链接里,所以就算暂时配置不好也完全没关系(比如你正在备案域名?),之后再改也完全来得及

ROCKET_TLS 这里面就是存放服务器证书的地址,还记得之前做的 server.key 和 server.crt 吗?按照我上图中的环境变量配置,我就要在刚才创建的 bitwarden_data 文件夹中再建一个 cert 文件夹,然后把这俩放进去

网络端口

把 3012 端口映射到 3012,把 80 端口映射到随便哪个空闲的端口,比如说 236

都放好以后,就点 Create,然后等它下载映像,安装,启动就可以了

nginx

也是在 Container Station 里面就可以,把网络设置改成 Host 模式,文件夹映射的话加上这个:

/etc/nginx 映射到 /Container/nginx

安装就行了

安装后它启动不了,因为还需要在/Container/nginx 里面放一个 nginx.conf

内容大概这样就可以了:

user  nginx;
worker_processes  1;

error_log  /etc/nginx/error.log warn;
pid        /etc/nginx.pid;

events {
    worker_connections  1024;
}
http{
	server {
		listen 235 ssl;

		ssl on;
        ssl_certificate /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;
        ssl_session_timeout 5m;
		ssl_protocols TLSv1.2 TLSv1.1 TLSv1 SSLv3;
		ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:HIGH:SEED:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!RSAPSK:!aDH:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!SRP;
        ssl_prefer_server_ciphers on;

		client_max_body_size 128M;
		
		location / {
			proxy_pass https://127.0.0.1:236/;
			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;
		}

		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 https://127.0.0.1:236;
		}
	}
}

这里面 ssl_certificate 和 ssl_certificate_key 两处配置,就自己把之前申请的证书放进去就可以了

端口的问题上,我这里是监听了 235 端口,实际使用上,在 Bitwarden 的客户端里也填https://ip:235就可以了

齐活

后面就是一些细节性的,比如说把证书文件藏好,别泄露出去啊,什么的

https://ip:235/admin 是管理员页面,密码就是之前设置的 ADMIN_TOKEN 环境变量

留下你的脚步
推荐阅读