Lastpass續(xù)費漲到36$/年膜蛔,用不起了,租個服務器自己host個開源的解決方案涩搓。
參考文檔:
https://hub.docker.com/r/bitwardenrs/server
基礎知識:
- 安裝完docker
- 掌握https污秆、證書申請
- 掌握nginx等webserver技術
- 有個自己的域名
好了,我們開始
在一臺接入了互聯(lián)網(wǎng)的主機上昧甘,下載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無法注冊用戶
結果無法使用,原因如下:
- 網(wǎng)頁版無法注冊用戶(必須開啟https才行充边,要求參見:https://hub.docker.com/r/bitwardenrs/server)
重要說明:某些網(wǎng)絡瀏覽器(例如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命令中蚓庭,指定證書相關參數(shù)即可致讥。但是,得先有個證書呀器赞。
SSL證書
要弄個證書來垢袱,首先要有個域名,然后港柜,證明這個域名是你能控制的请契。這樣,證書頒發(fā)機構才同意給你頒發(fā)證書夏醉。于是爽锥,這里需要做兩件事:
- 用自己的域名申請一個證書(參見:用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證書的網(wǎng)站長這樣腮考,把網(wǎng)址填進去,CHECK:
如果成功玄捕,應該得到兩把綠色的鎖頭踩蔚,一個是server,一個是chan枚粘,長得像下面這樣:
https://github.com/dani-garcia/bitwarden_rs/wiki/Enabling-HTTPS
您也可以使用https://www.ssllabs.com/ssltest/analyze.html進行檢查馅闽,但是該站點不支持自定義端口。另外馍迄,請記住選中“不要在面板上顯示結果”復選框福也,否則您的系統(tǒng)將在“最近看到”列表中可見。
這個地址長這樣:
這個網(wǎng)址會跑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的問題拿穴,這里給出的理由是,如果沒連接互聯(lián)網(wǎng)(我理解就是用自簽名證書忧风,也可能是我沒配置對默色,嗯瓶蚂,反正就是不行沉馆,在這個坑里爬了好久)是不可能得到合適的SSL證書的熊经,放棄https覆劈,滾回去用http。要么吃度,就去網(wǎng)站里面搞個A出來甩挫。我感覺是因為自簽名證書的chain只有一層,在這個報告里面監(jiān)測椿每,就會提示 chain incomplete伊者,最高標準就是B,達不到A间护。
另外亦渗,incomplete chain的問題,可以看看這個找找靈感:https://superuser.com/questions/644343/how-do-you-fix-an-incomplete-ssl-chain 汁尺。還可以用這個網(wǎng)站法精,去生成chain,https://certificatechain.io/痴突。當然亿虽,自簽名證書還不如直接申請一個免費的Let's Encrypt的3個月自動更新的證書。
用acme.sh申請證書
https://github.com/Neilpang/acme.sh
acme.sh是一個申請免費證書的腳本苞也,有效期3個月,到期需要更新粘秆。相關文檔網(wǎng)上一大堆如迟,是個不錯的github項目。附鏈接一個攻走,供大家參考殷勘。
acme.sh 需要先安裝,再使用昔搂。
坑3:acme.sh申請不成功
使用acme我遇到的問題是沒有找準webroot玲销。因為用其他站自帶的nginx,沒改過配置摘符,想當然地把非80端口site的webroot填到參數(shù)里贤斜。以為standalone模式可以指定端口,但是查了文檔才發(fā)現(xiàn)逛裤,standalone是起一個webserver臨時監(jiān)聽到80端口瘩绒,而指定端口的參數(shù),只有在反向代理后面才有效带族。
然而因為沒找準webroot锁荔,導致調試失敗次數(shù)過多,觸發(fā)了證書網(wǎng)站的限制蝙砌,導致還要等1小時以上才能再次嘗試阳堕。
https://letsencrypt.org/zh-cn/docs/rate-limits/
每個賬戶每小時每域名有最多驗證失敗 5 次的限制跋理。該限制次數(shù)在我們的測試環(huán)境中更高,因此您可以使用該環(huán)境來調試連接問題恬总。
解決這個問題前普,就是仔細查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