Nginx

Nginx 上的 MTLS 與客戶端 Android 應用程序一起使用?

  • April 20, 2021

有沒有辦法以便宜的方式獲得適用於無根 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 之前在應用程序管理/網路安全設置中明確允許這樣做?我假設更改存在有效且必要的安全原因。

有沒有辦法讓這項工作變得便宜?這就是我認為我的選擇:

  1. 購買可以簽署客戶端證書的公共知名 CA?不確定我是否可以擺脫便宜的 DV 或者它是否必須是更複雜和昂貴的東西?
  2. 在伺服器上設置 OpenVPN 服務,並為需要訪問的應用程序設置隧道。與客戶端證書相比,似乎有點矯枉過正。我使用的是小型 VPS,較少的成本對我來說是更好的選擇。
  3. 手動滾動上述 Android 應用程序的開源 APK,以允許使用者信任儲存。好像有點痛…
  4. 根所有設備以強制進行證書身份驗證。對於所有需要的設備,我不是一個選擇。
  5. 堅持使用 IP 白名單。不完美,但它確實可以將壞掃描器排除在外。

有沒有人有任何我可能不知道的替代建議、建議或更正我在上面嘗試做的事情?

乾杯

我最終使用了 Wireguard,到目前為止,它的資源似乎很少。

我使用 DDNS 白名單過濾了 Wireguard 埠,因為我已經有了它,然後我更改了 Nginx 以允許來自 VPN 的對等方,否則他們必須有一個有效的客戶端證書,其雜湊映射或 444。然後 Android 應用程序可以使用需要它們的特定應用程序的 VPN 隧道,然後所有其他應用程序都可以使用帶有證書的正常設置。

引用自:https://serverfault.com/questions/1060670