使用自建主机安装bitwarden,替代付费Lastpass

Lastpass续费涨到36$/年,用不起了,租个服务器自己host个开源的解决方案。

bitwarden-vs-lastpass.jpg

参考文档:

https://hub.docker.com/r/bitwardenrs/server

https://github.com/dani-garcia/bitwarden_rs/wiki/Private-CA-and-self-signed-certs-that-work-with-Chrome

基础知识:

  • 安装完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:

image-20200128022125668.png

如果成功,应该得到两把绿色的锁头,一个是server,一个是chan,长得像下面这样:

image-20200128022335972.png

https://github.com/dani-garcia/bitwarden_rs/wiki/Enabling-HTTPS

您也可以使用https://www.ssllabs.com/ssltest/analyze.html进行检查,但是该站点不支持自定义端口。另外,请记住选中“不要在面板上显示结果”复选框,否则您的系统将在“最近看到”列表中可见。

这个地址长这样:

image-20200128022834659.png

这个网址会跑1-2分钟,如果成功,就会得到A:

image-20200128022955415.png

得到B或者以下,Android APP就是无法使用的:

image-20200127021305598.png

注意,参考了一下这个,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 需要先安装,再使用。

https://stormy.fun/2019/01/05/acme-sh%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2%E6%9B%B4%E6%96%B0SSL%E8%AF%81%E4%B9%A6/

坑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

你可能感兴趣的:(使用自建主机安装bitwarden,替代付费Lastpass)