有没有一种廉价的方法可以获取在无 root 权限的 v10+ Android 客户端上运行的 MTLS/双向 SSL/客户端证书?
我有几个个人 API 端点,我希望它们仅供我和一些家庭成员公开访问,但过滤掉所有其他流量,如恶意机器人、漏洞扫描器或同一网关上的任何爱管闲事的客户端。我一直在使用 IP 过滤,它对机器人有效,但仍会暴露给白名单 IP 上的任何设备。
目前,我通过 Nginx 上的子域反向代理端点,然后使用 DDNS IP 白名单过滤访问,其余部分则禁用。限制 Nginx 访问的另一种方法是通过客户端证书/MTLS。这似乎是一个完美的选择,我可以让 Nginx 请求客户端证书作为可选,并禁用除匹配映射的 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,还是必须使用更复杂和更昂贵的 CA?
在服务器上设置 OpenVPN 服务,并为需要访问的应用程序建立隧道。与客户端证书相比,这似乎有点过头了。我使用的是小型 VPS,开销越少,对我来说就越好。
手动滚动上述 Android 应用程序的开源 APK 以允许用户信任存储。这似乎很麻烦...
对所有设备进行 root 以强制证书认证。对于我来说,这不是一个适合所有需要设备的选项。
坚持使用 IP 白名单。虽然不完美,但确实能阻止恶意扫描器。
是否有人对我可能不知道的上述操作有其他建议、建议或更正?
干杯
答案1
我最终使用了 Wireguard,到目前为止,它似乎对资源的要求较低。
我使用 DDNS 白名单过滤了 Wireguard 端口,因为我已经将它设置到位,然后我更改了 Nginx 以允许来自 VPN 的对等方,否则他们必须具有有效的客户端证书并且其哈希映射,否则他们会得到 444。然后 Android 应用程序可以将 VPN 隧道用于需要它们的特定应用程序,然后所有其他应用程序都可以使用带有证书的正常设置。