有没有办法以便宜的方式获得适用于无根 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 白名单。不完美,但它确实可以将坏扫描仪排除在外。
有没有人有任何我可能不知道的替代建议、建议或更正我在上面尝试做的事情?
干杯