使用自建主机安装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无法注册用户

结果无法使用,原因如下:

重要说明:某些网络浏览器(例如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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容