有没有办法以便宜的方式获得适用于无根 v10+ Android 客户端的 MTLS/双向 SSL/客户端证书?
我有几个个人 api 端点,我希望只有我和几个家庭成员可以公开访问它们,但会过滤掉所有其他流量,比如坏机器人、漏洞扫描程序或同一网关上的任何爱管闲事的客户端。我一直在使用适用于机器人的 IP 过滤,但仍会暴露给白名单 ip 上的任何设备。
目前,我通过 Nginx 上的子域对端点进行反向代理,然后使用 DDNS IP 白名单和 444 过滤其余的访问。另一个可用于限制 Nginx 访问的选项是通过客户端证书/MTLS。这似乎很合适,我可以让 Nginx 请求客户端证书作为可选,并且 444 除了匹配映射的 ssl_client_fingerprint 之外的所有流量。这将是一个比 IP 更严格的设置。
不过,我创建了自己的私有 EC 根 CA、中间服务器 CA 和客户端证书,所有证书都经过签名并链接在一起,并使用 OpenSSL 打包在 PFX 中。在 MacOS 和 Windows 上,一切都运行良好,并且在浏览器中和通过访问 API 的应用程序中都符合预期。Nginx 从客户端获取正确的证书,并允许匹配指纹哈希,否则会断开连接。
在 Android 10+ 上,通过浏览器访问时一切正常,完美。当我尝试通过 Android 应用程序访问 API 时出现问题,Nginx 没有得到客户端证书响应。
从我收集到的信息来看,这种设置曾经可以工作,也许 Android <=7 是事情发生变化的地方。我的理解是,从 8+ 开始,Android 应用程序在默认情况下根本不再信任用户信任存储/私有 CA 客户端链,只有公共系统存储,除非他们在编译 APK 之前在应用程序管理/网络安全设置中明确允许这样做?我假设更改存在有效且必要的安全原因。
有没有办法让这项工作变得便宜?这就是我认为我的选择:
购买可以签署客户端证书的公共知名 CA?不确定我是否可以摆脱便宜的 DV 或者它是否必须是更复杂和昂贵的东西?
在服务器上设置 OpenVPN 服务,并为需要访问的应用程序设置隧道。与客户端证书相比,似乎有点矫枉过正。我使用的是小型 VPS,较少的开销对我来说是更好的选择。
手动滚动上述 Android 应用程序的开源 APK,以允许用户信任存储。好像有点痛...
根所有设备以强制进行证书身份验证。对于所有需要的设备,我不是一个选择。
坚持使用 IP 白名单。不完美,但它确实可以将坏扫描仪排除在外。
有没有人有任何我可能不知道的替代建议、建议或更正我在上面尝试做的事情?
干杯
我最终使用了 Wireguard,到目前为止,它的资源似乎很轻。
我使用 DDNS 白名单过滤了 Wireguard 端口,因为我已经有了它,然后我更改了 Nginx 以允许来自 VPN 的对等方,否则他们必须有一个有效的客户端证书,其哈希映射或 444。然后 Android 应用程序可以使用需要它们的特定应用程序的 VPN 隧道,然后所有其他应用程序都可以使用带有证书的正常设置。