配置 HTTPS 与反向代理:让密码库走加密通道

上一篇我们把 Vaultwarden 跑在了内网的 8080 端口上,网页能开,服务活着。但这只是内测状态:你现在如果拿手机在外面访问它,或者在公司网络里登录它,输入的主密码和账号密码都会在网络上明文传输。这一篇要做的事,就是给密码库加一条加密通道,让任何地方的任何设备连过来,数据都是加密的。在自建场景里,这件事的标准做法是反向代理加真证书,我们会把最简单的一条路线完整走一遍,顺便把三条常见路线讲清楚,方便你以后按习惯挑。

为什么密码库不能走明文

密码库传的是什么?是你的主密码、是各个网站的账号密码本身。明文 http 之下,同一个公共 WiFi、同一段路由上的任何人,只要抓包工具在手,就能看到这些内容。你在咖啡厅连个免费热点登录自己的密码库,隔壁桌的人看到的不是乱码,而是你的钥匙串。更麻烦的是,明文状态下你也无法确认对面那台服务器真的是你自己的那台——域名解析被劫持一次,你以为自己登录的是家里的服务器,实际把密码交进了钓鱼站,全程毫无知觉。

HTTPS 在这里做两件事:一是加密传输内容,中间人只能看到一串乱码,看不到你输了什么;二是通过证书验证服务器身份,客户端发现证书不对会直接拒绝连接,钓鱼站拿不出合法证书就露馅。所以结论很直接:只要你打算在手机流量下、在公司或学校网络里访问自己的密码库,HTTPS 就不是可选项,而是刚需。自建场景里,HTTPS 一般由反向代理完成:反代服务替你持有证书,把加密后的流量解密,再转发给本机 8080 端口上的 Vaultwarden。浏览器到反代那一段是加密的,反代到本机服务这一段走内网,不暴露,这是这套架构安全的边界。

三条反代路线怎么选

方案 证书申请方式 上手难度 适合谁
Caddy 自动申请自动续期 最低 只想写三行配置
Nginx 需手动配证书或脚本 中等 已有 Nginx 环境
Nginx Proxy Manager 网页界面点点点 低 喜欢图形化管理

三个方案都能把事情做成,差别在省心程度。Caddy 是新手最省心的选择,配置文件三行,证书全自动,申请、续期、续期失败重试都不用你操心;Nginx 胜在通用、资料遍地,企业里到处是它,但证书申请和续期要自己接定时任务,多出来一整套运维动作;Nginx Proxy Manager 把反代和证书都做成了网页,点点鼠标就能加一个站点,适合已经在 Docker 里跑了一堆服务、想统一管理入口的玩家。域名解析怎么做、公网 IP 怎么用、路由器端口怎么放行,这些家庭网络层面的规划可以参考《软路由实战手册》,一台机器上跑多服务的环境怎么搭可以翻《家用 NAS 家庭服务器搭建指南》,本篇聚焦反代本身。

如果你拿不准选哪个,直接选 Caddy。理由很实在:你的目标是「让密码库走加密通道」,不是「研究反代技术」,Caddy 用最少的配置完成这个目标,出问题时它的日志也直白。等以后你在这台设备上跑了五六个服务,想统一管理入口了,再迁到 Nginx Proxy Manager 也不迟,那时候你对反代已经有感觉了,迁移成本很低。

如果你已经是 Nginx 的老用户,沿用 Nginx 也完全没问题,只是证书那部分要自己接好。对新手而言,Caddy 的优势不是功能多,而是少出错:少一个手动步骤,就少一个翻车点。

选好路线之后,把 Caddyfile 或 Nginx 配置当成密码库的一部分来对待,备份时一起带上。以后换设备、重装系统,这份配置就是你恢复加密通道的全部家底。

如果你打算以后在这台设备上跑不止密码库这一个服务,那现在顺手把反代的目录结构整理好:一个站点一个配置片段,以后加新服务就是加一个片段,reload 一下。这个习惯从第一篇就养成,后面会省很多事。

等你把这套跑顺了,你会发现反代其实就是家庭服务器的「大门」:外面来的所有请求都从这扇门进,里面每个服务各住一间屋。密码库只是这间大屋子里的第一间。

后面还会有第二间、第三间,但大门是这一篇建好的,以后都用它。这就是反代的意义:一次配好,长期复用。以后你要加新的站点,只是在配置里多加一段,剩下的交给它自动续期、自动转发。这就是为什么反代值得一次性配好。配好一次,后面所有服务都跟着受益。这就是反代的长期价值:一次投入,长期复用,这就是反代的价值所在,值得投入一次。

两条常见路线对比

用 Caddy 十分钟配上 HTTPS

开工前先备齐三样东西:一个你能管的域名、域名解析记录指到家里的公网地址、公网 443 端口已经放行到跑 Caddy 的这台机器上。这三样缺一样,Caddy 都拿不到证书,这是最容易被忽略的前提。装好 Caddy 之后,新建一个名叫 Caddyfile 的文件,内容可以整段照抄:

password.example.com {
    reverse_proxy 127.0.0.1:8080
}

把第一行的域名换成你自己的,保存,执行 reload 让 Caddy 重新加载配置,就完事了。Caddy 启动后会自动向公共证书机构申请证书,整个过程不需要你碰任何密钥文件、不需要跑脚本、不需要手动改任何加密参数。它做的事情很简单:凡是访问这个域名的加密请求,由它接住、解密,再原样转给本机 8080 端口上的 Vaultwarden;Vaultwarden 返回的内容,Caddy 再加密送回客户端。这个转发对 Vaultwarden 本身是透明的,它甚至不知道自己前面多了一层。

配完之后,建议你做一次端到端的确认:先用电脑浏览器访问域名,看到小锁;再用手机切到流量,关掉 WiFi,访问同一个域名,确认能登录。第二次确认特别重要,它证明你家的公网入口、域名解析、证书申请这整条链路在真实外部网络里是通的,不是只在局域网里自嗨。任何一步失败,回到对应环节排查,别带着疑问往下走。

证书申请与自动续期的说明

公共证书机构发的证书有效期只有九十天左右,但 Caddy 会在到期前自动帮你续期,你什么都不用做。想确认续期正常,过一两个月直接访问一次你的域名地址,浏览器地址栏出现小锁标志,就说明证书有效;再不顺心,就去翻 Caddy 的日志,续期失败它会写得明明白白。如果你当初选的是 Nginx 路线,那就要自己用证书申请工具签发,再写一条定时任务负责续期——这多出来的一整套步骤,正是 Caddy 省心的原因。自签名证书在手机 App 上往往还会被直接拒掉,所以除非你只在最可信的内网里用,否则不要在证书上省这一步,配真证书是一次性投入、长期省心。

这里顺便说清楚一个边界:反代只负责接住外部来的加密请求,它不改变 Vaultwarden 本身的任何行为。Vaultwarden 容器内部还是监听 80 端口,数据卷还是挂在 vw-data,你之前部署的东西一行都不用动。这种「前面加一层、后面不动」的架构,正是反代最迷人的地方——哪天你想换证书方案、想加一个新的站点,都只动反代这一层,密码库本身安安稳稳不受打扰。

反代还有一个附带的好处:它把对外暴露的入口收归一处。以前你每个服务都要在路由器上映射一个端口,现在所有服务都从反代这一个门进出,路由器只放行 443,暴露面小了一大圈。这也是家庭服务器玩久了之后的标准做法,密码库正好是你实践这套架构的第一个服务。

只想内网用,能不能跳过 HTTPS

有些朋友会问:我只在家里局域网里用,手机连家里 WiFi 就够,能不能不配证书,省事。答案是:可以,但有代价。内网直连 8080 端口,意味着你在家以外的任何网络都用不了密码库,而密码库最大的价值恰恰是「出门在外也能查密码」。另外,家里万一有访客连了同一个 WiFi,明文流量对他就是透明的。所以即使你暂时没有公网 IP,也建议先用组网工具把加密通道搭起来,把真证书这一步留给以后有公网的那天——这一篇的配置,到时候直接复用。

一次加密请求的完整走向

验证与常见问题

打开浏览器访问你的域名地址,协议是加密的那种,地址栏出现小锁,就成了。常见的坑有三个:域名解析还没生效就急着访问,浏览器报找不到站点,等几分钟再刷;443 端口忘了在路由器上放行,外部连不进来,内网能开、外网打不开多半就是它;家里是运营商大内网、没有公网 IP,证书申请这一步会直接失败,因为证书机构验证不了你对域名的控制权。最后一种情况,可以先用内网加组网工具顶着,或者老老实实做内网穿透,把问题解决再回来配证书。HTTPS 通了之后,你的密码库才算真正对外开放可用,下一篇就可以注册主账号、设主密码了。

最后再强调一次边界:反代配好之后,你以后所有的客户端都应该只通过域名加加密协议访问密码库,不要再直连 8080 端口。直连虽然在内网能用,但它绕过了证书这一层,手机在外面连过来就会暴露。养成习惯:凡是访问密码库,地址栏必须是你的域名,小锁必须亮着,这两个条件满足了再输主密码。

总结一下这一篇的决策链:服务跑起来之后,你面对的不是「要不要加密」,而是「用哪条路线加密」。三条路线里挑最省心的 Caddy,配三行配置,剩下的交给它自动跑。这个习惯一旦养成,密码库就从「内网玩具」变成了「随身保险箱」。

延伸阅读