Nginx 上的 MTLS 與客戶端 Android 應用程序一起使用?
有沒有辦法以便宜的方式獲得適用於無根 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 隧道,然後所有其他應用程序都可以使用帶有證書的正常設置。