Lastpass续费涨到36$/年,用不起了,租个服务器自己host个开源的解决方案。
参考文档:
https://hub.docker.com/r/bitwardenrs/server
基础知识:
- 安装完docker
- 掌握https、证书申请
- 掌握nginx等webserver技术
- 有个自己的域名
好了,我们开始
在一台接入了互联网的主机上,下载docker image并运行:
docker pull bitwardenrs/server:latest
docker run -d --name bitwarden -v /bw-data/:/data/ -p 80:80 bitwardenrs/server:latest
sudo docker run -d --name bitwarden -v /home/ubuntu/bitwarden/bw-data:/data/ -p 443:80 bitwardenrs/server:latest
附:调教docker的常用命令:
sudo docker kill bitwarden
sudo docker rm bitwarden
然鹅,事情并没有那么简单:
坑1:Chrome无法注册用户
结果无法使用,原因如下:
- 网页版无法注册用户(必须开启https才行,要求参见:https://hub.docker.com/r/bitwardenrs/server)
重要说明:某些网络浏览器(例如Chrome)不允许在不安全的上下文中使用Web Crypto API。在这种情况下,您可能会收到诸如无法读取属性“ importKey”的错误。要解决此问题,您需要从HTTPS访问Web保管库。
坑2:Android手机APP连不上服务器
- Android手机上的APP登陆时提示:
java.security.cert.certpathvalidatorexception trust anchor for certification path not found
HTTPS
解决坑1-2的关键,就是正确地配置https。启用https,可以参考这里:
https://github.com/dani-garcia/bitwarden_rs/wiki/Enabling-HTTPS
简而言之,就是在docker命令中,指定证书相关参数即可。但是,得先有个证书呀。
SSL证书
要弄个证书来,首先要有个域名,然后,证明这个域名是你能控制的。这样,证书颁发机构才同意给你颁发证书。于是,这里需要做两件事:
- 用自己的域名申请一个证书(参见:用acme.sh申请证书)
- 把这个证书配到docker上(参见:大成功)
关于坑2-Android APP连不上的问题:本质是该服务器的https证书必须要达到基线要求。
基线要求参见文档:
https://github.com/dani-garcia/bitwarden_rs/wiki/Enabling-HTTPS
当您的bitwarden_rs服务器可供外界使用时,您可以使用https://comodosslstore.com/ssltools/ssl-checker.php来检查SSL证书(包括该链)是否有效。没有链,Android设备将无法连接。
验证SSL证书的网站长这样,把网址填进去,CHECK:
如果成功,应该得到两把绿色的锁头,一个是server,一个是chan,长得像下面这样:
https://github.com/dani-garcia/bitwarden_rs/wiki/Enabling-HTTPS
您也可以使用https://www.ssllabs.com/ssltest/analyze.html进行检查,但是该站点不支持自定义端口。另外,请记住选中“不要在面板上显示结果”复选框,否则您的系统将在“最近看到”列表中可见。
这个地址长这样:
这个网址会跑1-2分钟,如果成功,就会得到A:
得到B或者以下,Android APP就是无法使用的:
注意,参考了一下这个,https://tic.gal/en/java-security-cert-certpathvalidatorexception-trust-anchor-for-certification-path-not-found/,是一个其他的app,也有cert path exception的问题,这里给出的理由是,如果没连接互联网(我理解就是用自签名证书,也可能是我没配置对,嗯,反正就是不行,在这个坑里爬了好久)是不可能得到合适的SSL证书的,放弃https,滚回去用http。要么,就去网站里面搞个A出来。我感觉是因为自签名证书的chain只有一层,在这个报告里面监测,就会提示 chain incomplete,最高标准就是B,达不到A。
另外,incomplete chain的问题,可以看看这个找找灵感:https://superuser.com/questions/644343/how-do-you-fix-an-incomplete-ssl-chain 。还可以用这个网站,去生成chain,https://certificatechain.io/。当然,自签名证书还不如直接申请一个免费的Let's Encrypt的3个月自动更新的证书。
用acme.sh申请证书
https://github.com/Neilpang/acme.sh
acme.sh是一个申请免费证书的脚本,有效期3个月,到期需要更新。相关文档网上一大堆,是个不错的github项目。附链接一个,供大家参考。
acme.sh 需要先安装,再使用。
坑3:acme.sh申请不成功
使用acme我遇到的问题是没有找准webroot。因为用其他站自带的nginx,没改过配置,想当然地把非80端口site的webroot填到参数里。以为standalone模式可以指定端口,但是查了文档才发现,standalone是起一个webserver临时监听到80端口,而指定端口的参数,只有在反向代理后面才有效。
然而因为没找准webroot,导致调试失败次数过多,触发了证书网站的限制,导致还要等1小时以上才能再次尝试。
https://letsencrypt.org/zh-cn/docs/rate-limits/
每个账户每小时每域名有最多验证失败 5 次的限制。该限制次数在我们的测试环境中更高,因此您可以使用该环境来调试连接问题。
解决这个问题,就是仔细查nginx的配置文档,结果从default site找到了80端口对应的webroot,填上去,完美解决,下面是申请证书成功了的命令与提示。
/home/ubuntu/.acme.sh/acme.sh --issue -d test.com -d www.test.com -w /var/www/html --debug
......
[Tue Jan 28 01:38:57 CST 2020] Your cert is in /root/.acme.sh/test.com/test.com.cer
[Tue Jan 28 01:38:57 CST 2020] Your cert key is in /root/.acme.sh/test.com/test.com.key
[Tue Jan 28 01:38:57 CST 2020] v2 chain.
[Tue Jan 28 01:38:57 CST 2020] The intermediate CA cert is in /root/.acme.sh/test.com/ca.cer
[Tue Jan 28 01:38:57 CST 2020] And the full chain certs is there: /root/.acme.sh/test.com/fullchain.cer
[Tue Jan 28 01:38:57 CST 2020] _on_issue_success
大成功
按照生成证书的地址,配置docker的目录镜像,用下面的命令跑起来,验证ssl通过,Android登陆正常:
sudo docker run -d --name bitwarden \
-e ROCKET_TLS='{certs="/ssl/fullchain.cer",key="/ssl/test.com.key"}' \
-v /home/ubuntu/bitwarden/bw-data:/data/ \
-v /root/.acme.sh/test.com/:/ssl/ \
-p 443:80 bitwardenrs/server:latest