Expo-sovellus epäonnistuu HTTP:ssä Android 9:ssä: syy on cleartext, ei VPN
Tavallista HTTP-rajapintaa kutsuva Expo-koonnos epäonnistuu Android 9:ssä ja uudemmissa. Tunneli on syytön: cleartext-lippu kuuluu koonnoksen asetuksiin.
Julkaisit uuden koonnoksen, siirryit VPN:ään, ja sama näkymä lakkasi latautumasta. Android 9:ssä ja uudemmissa tavallisempi selitys on tylsempi: alusta kieltäytyy tavallisesta HTTP:stä sovelluksilta, jotka kohdistavat API 28:aan tai uudempaan, ja VPN muutti vain sen verran kontekstia, että se paljastui. Näkemäsi virhe riippuu HTTP-asiakasohjelmasta, siksi se niin harvoin sanoo cleartext.
Mitä tämä epäonnistuminen oikeastaan on
Android 9:stä alkaen alusta estää cleartextin oletuksena heti, kun sovellus kohdistaa API-tasoon 28 tai uudempaan. Alusta hylkää tavalliseen HTTP-osoitteeseen tehdyn pyynnön ennen kuin yksikään paketti lähtee laitteesta. Minkä virheen näet, riippuu HTTP-kirjastosta: joskus yleinen verkkovirhe, joskus aikakatkaisu, joskus viesti, joka nimeää cleartextin suoraan. Mitä se ei koskaan tee, on päätyä palvelimellesi. Android dokumentoi oletuksen ja toimialuekohtaisen vaihtoehdon tietoturva-asetusten oppaassaan.
Samassa laitteessa oleva selain voi silti ladata sivun, ja se on vihje, jonka useimmat ohittavat. Selaimet eivät ole sovelluksesi verkkoturvallisuuskäytännön alaisia.
Miksi VPN saa syyn niskoilleen
Kolme asiaa muuttuu yleensä yhtä aikaa. Sovellus voi selvittää toisen isäntänimen VPN:n yhdistämisen jälkeen, laite voi olla uusi ja uudemmalla koonnoksella, tai itse koonnos on voinut siirtyä kohde-API-tasolle, joka laukaisee oletuksen. VPN on näkyvissä ja kohde-SDK ei, joten VPN saa lipun.
Vertaa vanhan ja uuden koonnoksen kohdetasoja ennen kuin kosket verkon asetuksiin. Sovellus, joka kohdistaa 27:ään tai alempaan, on vapautettu, ja se selittää jokaisen raportin tyyliä «toimii vanhassa puhelimessani».
Mihin Expo-lippu todella päätyy
Hallinnoidussa Expo-projektissa asetuksen lisääminen tiedostoon app.json ei muokkaa Androidin manifestia, koska manifestin tuottavat prebuild ja kehityskoonnokset. Asetuksen kirjoittaa siinä vaiheessa konfiguraatioliitännäinen. Tuettu reitti on expo-build-properties, joka määritetään sovelluksen asetuksissa cleartext-valinnalla android-kohdan alla.
{
"plugins": [
["expo-build-properties", {
"android": { "usesCleartextTraffic": true }
}]
]
}Katkelma asettaa vain liitännäisen valinnan; manifesti syntyy myöhemmin. Aja prebuild tai tuore kehitysasiakas-koonnos ja tarkista sitten ennen uutta testiä luodusta AndroidManifest.xml-tiedostosta android:usesCleartextTraffic, koska pelkkä JS-lataus pitää vanhan manifestin. Sovita liitännäisen versio siihen Expo SDK:hon, jolla projekti pyörii. Liitännäisen valinnat liikkuvat julkaisujen välillä, ja toisesta SDK:sta kopioitu katkelma on luotettava lähde äänettömille no-opeille.
Bare-työnkulku ja kapeampi vaihtoehto
Bare React Nativessa vastine on android:usesCleartextTraffic application-elementissä tai verkon tietoturva-asetus, joka sallii cleartextin vain nimetyille toimialueille. Toimialuekohtainen muoto on se, jota kannattaa suosia, koska se sallii sisäisen API:n ja jättää kaiken muun HTTPS:ään. Se dokumentoi myös oman poikkeusluettelonsa, ja juuri siitä katselmoija kysyy.
Kumpikaan lähestymistapa ei muuta alustan oletusta millekään, mitä et nimennyt.
Todista se ensin laitteen lokista
Ennen asetusten muokkaamista hanki tarkka virhe. Liitetyssä laitteessa adb logcat näyttää alustan cleartext-hylkäyksen ja nimeää komponentin, joka sen aiheutti. Hylätty socket, nimi, jota ei voi selvittää, tai epäonnistunut TLS-kättely osoittavat aivan muualle, ja cleartextin käyttöönotto vain heikentäisi sovellusta turhaan.
Pidä sitten tuotanto rehellisenä. Cleartext on hyväksyttävää laboratoriopäätepisteelle, joka ei voi tarjota TLS:ää, ja vain niin lyhyeksi ajaksi kuin pystyt aikatauluttamaan. Jos API voi lopettaa TLS:n yksityisverkon sisällä, laita varmenne laitteen luottamusvarastoon ja jätä cleartext pois päältä, koska tunneli salaa polun ulostuloonsa asti eikä mitään sen jälkeen.
Kun päätepiste vastaa HTTPS:llä, poista käyttöoikeus, kokoa uudelleen ja testaa VPN:ssä ja tavallisessa Wi-Fi:ssä samassa istunnossa. Nimien selvitys voi vaihdella näiden kahden polun välillä, ja vain pari kertoo, kumpi puhuu totta.