Aplikácia Expo zlyháva na HTTP v Androide 9: ide o cleartext, nie o VPN
Build Expo, ktorý volá obyčajné HTTP API, zlyháva na Androide 9 a novšom. Tunel je nevinný: príznak cleartext patrí do konfigurácie buildu.
Vydali ste nový build, prešli na VPN a tá istá obrazovka sa prestala načítavať. Na Androide 9 a novšom je častejšie vysvetlenie nudnejšie: platforma odmieta obyčajné HTTP aplikáciám, ktoré cieľujú na API 28 alebo vyššie, a VPN zmenila len toľko kontextu, aby to odhalila. Chyba, ktorú vidíte, závisí od HTTP klienta, a preto tak zriedka hovorí cleartext.
Čo to zlyhanie vlastne je
Od Androidu 9 platforma predvolene blokuje cleartext, len čo aplikácia cieľuje na úroveň API 28 alebo vyššiu. Požiadavku na obyčajnú HTTP adresu platforma odmietne skôr, než zariadenie opustí čo i len jeden paket. Akú chybu uvidíte, závisí od HTTP knižnice: niekedy všeobecné zlyhanie siete, niekedy vypršanie času, niekedy správa, ktorá cleartext priamo pomenuje. Čo nikdy nerobí, je dostať sa na váš server. Android dokumentuje predvolené správanie aj alternatívu obmedzenú na domény v príručke ku konfigurácii zabezpečenia.
Prehliadač na tom istom zariadení stránku stále načíta, a to je stopa, ktorú väčšina ľudí prehliadne. Prehliadače nepodliehajú sieťovej bezpečnostnej politike vašej aplikácie.
Prečo sa obviňuje VPN
Zvyčajne sa menia tri veci naraz. Aplikácia môže po pripojení VPN prekladať iné meno hostiteľa, zariadenie môže byť nové s novším buildom, alebo sa samotný build mohol posunúť na cieľovú úroveň API, ktorá predvolené správanie spustí. VPN je viditeľná a cieľové SDK nie, takže lístok dostane VPN.
Porovnajte cieľové úrovne starého a nového buildu, skôr než sa dotknete sieťovej konfigurácie. Aplikácia cieľujúca na 27 alebo nižšie je vyňatá, a to vysvetľuje každé hlásenie „mne to na staršom telefóne funguje“.
Kam príznak Expo naozaj dopadne
V spravovanom projekte Expo pridanie nastavenia do app.json needituje manifest Androidu, pretože manifest vytvárajú prebuild a vývojové buildy. Práve konfiguračný plugin nastavenie v tej fáze zapisuje. Podporovaná cesta je expo-build-properties, nastavený v konfigurácii aplikácie s voľbou cleartext pod android.
{
"plugins": [
["expo-build-properties", {
"android": { "usesCleartextTraffic": true }
}]
]
}Úryvok nastaví len voľbu pluginu; manifest vzniká neskôr. Spustite prebuild alebo čerstvý build vývojového klienta a potom pred opätovným testom skontrolujte vygenerovaný AndroidManifest.xml na android:usesCleartextTraffic, pretože opätovné načítanie iba cez JS ponechá starý manifest. Zlaďte verziu pluginu s Expo SDK, na ktorom projekt beží. Voľby pluginu sa medzi vydaniami posúvajú a úryvok skopírovaný z iného SDK je spoľahlivým zdrojom tichých no-opov.
Bare postup a užšia možnosť
Pre bare React Native je ekvivalentom android:usesCleartextTraffic na elemente application, alebo sieťová bezpečnostná konfigurácia, ktorá povoľuje cleartext len pre pomenované domény. Forma obmedzená na domény je tá, ktorú treba uprednostniť, pretože povoľuje interné API a všetko ostatné necháva na HTTPS. Dokumentuje aj svoj vlastný zoznam výnimiek, a to je časť, na ktorú sa recenzent opýta.
Ani jeden z prístupov nemení predvolené správanie platformy pre nič, čo ste nepomenovali.
Najprv to dokážte z logu zariadenia
Pred úpravou konfigurácie získajte presné zlyhanie. adb logcat na pripojenom zariadení ukáže odmietnutie cleartextu platformou a pomenuje komponent, ktorý ho vyvolal. Odmietnutý socket, meno, ktoré sa nedá preložiť, alebo neúspešný TLS handshake ukazujú úplne inam, a zapnutie cleartextu by aplikáciu len zbytočne oslabilo.
Potom držte produkciu čestnú. Cleartext je prijateľný pre laboratórny endpoint, ktorý nemôže ponúknuť TLS, a len na najkratší čas, ktorý dokážete naplánovať. Ak API dokáže ukončiť TLS vnútri privátnej siete, dajte certifikát do úložiska dôveryhodných certifikátov zariadenia a nechajte cleartext vypnutý, pretože tunel šifruje cestu k svojmu výstupu a nič za ním.
Keď endpoint odpovie cez HTTPS, odoberte oprávnenie, znova zostavte a otestujte na VPN aj na bežnej Wi-Fi v tej istej relácii. Preklad mien sa medzi týmito dvoma cestami môže líšiť a len dvojica vám povie, ktorá hovorí pravdu.