Expo-app mislearret mei HTTP op Android 9: it is cleartext, net de VPN
In Expo-build dy’t in gewoane HTTP-API oanropt, mislearret op Android 9 en letter. De tunnel is ûnskuldich: de cleartext-flag heart yn ’e buildkonfiguraasje.
Jo hawwe in nije build útbrocht, binne oerstapt op de VPN, en itselde skerm hold op mei laden. Op Android 9 en letter is de faker foarkommende ferklearring ferfeelsumer: it platfoarm wegeret gewoane HTTP foar apps dy’t rjochtsje op API 28 of heger, en de VPN feroare mar krekt genôch kontekst om it te iepenbierjen. De flater dy’t jo krije hinget ôf fan de HTTP-klant, dêrom seit er sa selden cleartext.
Wat dy mislearring eins is
Fan Android 9 ôf blokkearret it platfoarm cleartext standert sadree’t in app rjochtet op API-nivo 28 of heger. It fersyk nei in gewoan HTTP-adres wurdt troch it platfoarm wegere foardat ien pakket it apparaat ferlit. Hokker flater jo sjogge hinget ôf fan de HTTP-bibleteek: soms in algemiene netwurkflater, soms in time-out, soms in berjocht dat cleartext direkt neamt. Wat it nea docht, is jo server berikke. Android dokumintearret de standert en it domeinbeheinde alternatyf yn syn hantlieding foar feilichheidskonfiguraasje.
In browser op itselde apparaat kin de side noch laden, en dat is de oanwizing dy’t de measte minsken misse. Browers binne net ûnderwurpen oan it netwurkfeilichheidsbelied fan jo app.
Wêrom’t de VPN de skuld kriget
Trije dingen feroarje meastentiids tagelyk. De app kin nei it ferbinen fan de VPN in oare hostnamme oplosse, it apparaat kin nij wêze mei in nijere build, of de build sels kin nei in doel-API-nivo ferhuze wêze dat de standert aktivearret. De VPN is sichtber en de doel-SDK net, dus de VPN kriget it ticket.
Fergelykje de doelnivo’s fan de âlde en nije build foardat jo de netwurkkonfiguraasje oanreitsje. In app dy’t rjochtet op 27 of leger is frijsteld, en dat ferklearret elk rapport fan it type «by my wurket it op ’e âldere telefoan».
Wêr’t de Expo-flag echt telâne komt
Yn in beheard Expo-projekt bewurket it tafoegjen fan in ynstelling oan app.json gjin Android-manifest, om’t prebuild en ûntwikkelingsbuilds it manifest produsearje. In konfiguraasjeplug-in is wat de ynstelling yn dy faze skriuwt. It stipe paad is expo-build-properties, konfigurearre yn ’e appkonfiguraasje mei de cleartext-opsje ûnder android.
{
"plugins": [
["expo-build-properties", {
"android": { "usesCleartextTraffic": true }
}]
]
}It fragmint set allinnich de plug-inopsje; it manifest wurdt letter produsearre. Rin in prebuild of in frisse ûntwikkelingskliïnt-build, en besjoch dan foardat jo opnij testje it generearre AndroidManifest.xml op android:usesCleartextTraffic, om’t in werladen mei allinnich JS it âlde manifest hâldt. Lês de plug-inferzje lyk mei de Expo SDK dêr’t it projekt op rint. Plug-inopsjes ferskowe tusken útjeften, en in fragmint dat fan in oare SDK kopiearre is, is in betroubere boarne fan stille no-ops.
De bare-wurkstream en de smellere opsje
Foar bare React Native is it ekwivalint android:usesCleartextTraffic op it application-elemint, of in netwurkfeilichheidskonfiguraasje dy’t cleartext allinnich foar neamde domeinen tastiet. De domeinbeheinde foarm is dejinge dy’t de foarkar krijt, om’t er de ynterne API tastiet en al it oare op HTTPS lit. Hy dokumintearret ek syn eigen útsûnderingslist, en dat is it diel dêr’t in beoardieler om freegje sil.
Gjin fan beide oanpakken feroaret de standert fan it platfoarm foar eat dat jo net neamd hawwe.
Bewiis it earst út it apparaatloch
Foardat jo de konfiguraasje bewurkje, krije de krekte flater. adb logcat op in oansletten apparaat toant de cleartext-ôfwizing fan it platfoarm en neamt it ûnderdiel dat dy feroarsake hat. In wegere socket, in namme dy’t net oploset of in mislearre TLS-hânjaan wize nei hielendal earne oars, en cleartext oansette soe de app allinnich mar foar neat ferswakje.
Hâld dan de produksje earlik. Cleartext is akseptabel foar in laboratoarium-einpunt dat gjin TLS biede kin, en allinnich foar de koartste tiid dy’t jo planne kinne. As de API TLS binnen it partikuliere netwurk beëinigje kin, set dan it sertifikaat yn ’e fertrouwensopslach fan it apparaat en lit cleartext útskeakele, om’t de tunnel it paad nei syn útgean fersiferet en neat dêrnei.
Sadree’t it einpunt oer HTTPS antwurdet, smyt de tastimming fuort, bou opnij en test op ’e VPN en op gewoane Wi-Fi yn deselde sesje. Namme-oplossing kin ferskille tusken dy twa paden, en allinnich it pear fertelt jo hokker fan beide de wierheid seit.