前言:我的配置
我一直是 Bitwarden 的忠实用户,并且为了数据自由和可控性,以及省钱,选择了自建服务。我的整套配置如下:
- 服务器:腾讯云服务器
- 密码服务:Vaultwarden (Bitwarden 的 Rust 实现) Docker 镜像
- 域名:腾讯云托管的个人域名
- 客户端:全平台 Bitwarden 客户端
- 反向代理:Caddy 自动处理 HTTPS
这套组合一直稳定运行,直到今天……
一、问题的发现
今天像往常一样,我打开手机上的 Bitwarden App,想添加一个新的登录项。但奇怪的是,当我点击保存后,在列表里却怎么也找不到刚刚添加的项目。
起初我以为是 App 的 Bug,但为了保险起见,我打开了电脑客户端尝试添加,结果客户端直接提示我保存失败。
这时我意识到,问题可能没那么简单,大概率是客户端与我服务器之间的接口通信出了问题。
二、排查之路
1. 初步诊断:证书过期
我首先想到的是检查我的 Vaultwarden 管理页面。我通过域名访问,结果发现了第一个问题:
- HTTP 访问:直接被腾讯云拦截,提示“该网站未根据工信部相关法律规则进行备案”。
- HTTPS 访问:可以打开页面,但浏览器地址栏赫然显示着“不安全”的警告——SSL 证书过期了。
(图:腾讯云因未备案拦截页面)
破案了?看起来八九不离十。证书过期导致 API 接口的 HTTPS 请求失败,客户端自然无法正常保存数据。
2. 深入探究:Caddy 为何没自动续期?
但新的问题也随之而来:我使用 Caddy 就是因为它能自动实现 HTTPS,可以自动申请证书并续签,为什么这次偏偏就失效了?更奇怪的是,我同一台服务器上的其他服务的域名都能正常访问,证书也都是有效的,唯独 Bitwarden 的这个域名出了问题。
我尝试重启 Caddy 服务、重新加载配置,但都无济于事。无奈之下,只能去看 Caddy 的运行日志。
日志中的错误信息揭示了真相:Caddy 在尝试申请新的 HTTPS 证书时,需要通过 HTTP 端口进行验证(HTTP-01 challenge)。然而,这个验证请求被腾讯云的直接拦截并返回了一个未备案提示的页面。
所以,核心原因找到了:腾讯云升级了防火墙策略。以前对于未备案的域名,仅仅是拦截了 80 端口的访问,而现在,它会拦截所有端口的对外服务。
这个策略直接导致了 Caddy 的证书续期 / 申请机制完全失效。
三、挣扎与放弃
尝试迁移域名
既然是腾讯云的问题,我心想,能不能把域名解析迁移到 Cloudflare,利用 Cloudflare 的 DNS 服务来绕过这个限制?
然而,当我尝试在腾讯云后台修改域名的 NS (Name Server) 记录时,发现这个选项是锁定的!想要修改,必须通过一个独立的“DNS 服务器修改”入口,比较隐蔽。
然后迁移后发现其实也没有作用,拦截实际上是发生在服务器上而不是 dns 解析上(也可能是两边都会有拦截)
四、最终的解决方案
最后为了稳定性和省心,选择了付费订阅 Bitwarden 高级会员,$10 一年,不再折腾。这境内的个人云服务器感觉用处越来越小,要不是博客需要备案号需要云服务器,绝对停掉转用境外的云服务器。