Expo қолданбасы Android 9 жүйесінде HTTP-де сәтсіздікке ұшырайды: себебі cleartext, VPN емес
Қарапайым HTTP API шақыратын Expo builds Android 9 және одан жоғары нұсқаларда істемейді. Туннель кінәсіз: cleartext жалаушасы build конфигурациясында болуы керек.
Сіз жаңа build шығардыңыз, VPN-ге көштіңіз, және сол экран жүктелмей қалды. Android 9 және одан жоғары нұсқаларда жиі кездесетін түсініктеме зеріктірер: платформа API 28 немесе одан жоғары деңгейді мақсат ететін қолданбалар үшін қарапайым HTTP-ны қабылдамайды, ал VPN оны ашқызуға жететін контексті ғана өзгертті. Көріп отырған қатеңіз HTTP клиентіне байланысты, сондықтан ол cleartext деп өте сирек айтады.
Бұл сәтсіздік шын мәнінде неде
Android 9-дан бастап платформа қолданба API 28 немесе одан жоғары деңгейді мақсат еткен бойда cleartext-ті әдепкі бойынша бұғаттайды. Қарапайым HTTP мекенжайына жіберілген сұрау құрылғыдан бір пакет шықпай тұрып платформамен қабылданбайды. Қандай қате көретініңіз HTTP кітапханасына байланысты: кейде жалпы желілік ақау, кейде уақыт біту, кейде cleartext-ті ашық атайтын хабарлама. Ол ешқашан істемейтін нәрсе — серверіңізге жету. Android әдепкі мінез-құлық пен доменмен шектелген баламаны өзінің қауіпсіздік конфигурациясы жөніндегі нұсқаулығында құжаттайды.
Сол құрылғыдағы браузер бетті әлі де жүктей алады, және көпшілік байқамайтын ишара осы. Браузерлер қолданбаңыздың желілік қауіпсіздік саясатына бағынбайды.
Неге VPN кінәланады
Әдетте үш нәрсе бір уақытта өзгереді. Қолданба VPN қосылғаннан кейін басқа хост атауын шешуі мүмкін, құрылғы жаңа және жаңарақ build-пен болуы мүмкін, немесе build-тің өзі әдепкі мінез-құлықты іске қосатын мақсатты API деңгейіне көшкен болуы мүмкін. VPN көрінеді, ал мақсатты SDK көрінбейді, сондықтан билетті VPN алады.
Желілік конфигурацияға тиіспес бұрын ескі және жаңа build-тің мақсатты деңгейлерін салыстырыңыз. 27 немесе одан төмен деңгейді мақсат ететін қолданба босатылады, және бұл «менің ескі телефонымда жұмыс істейді» деген әрбір есепті түсіндіреді.
Expo жалаушасы шын мәнінде қайда түседі
Басқарылатын Expo жобасында app.json файлына параметр қосу Android манифестін өңдемейді, өйткені манифесті prebuild және development build-тер жасайды. Сол кезеңде параметрді конфигурация плагині жазады. Қолдау көрсетілетін жол — expo-build-properties, ол қолданба конфигурациясында android астында cleartext опциясымен бапталады.
{
"plugins": [
["expo-build-properties", {
"android": { "usesCleartextTraffic": true }
}]
]
}Үзінді тек плагин опциясын орнатады; манифест кейінірек жасалады. Prebuild немесе жаңа development-client build іске қосыңыз, содан кейін қайта тексеру алдында жасалған AndroidManifest.xml файлынан android:usesCleartextTraffic бар-жоғын қараңыз, өйткені тек JS арқылы қайта жүктеу ескі манифесті сақтайды. Плагин нұсқасын жоба жұмыс істейтін Expo SDK-мен сәйкестендіріңіз. Плагин опциялары шығарылымдар арасында жылжиды, ал басқа SDK-дан көшірілген үзінді үнсіз әрекетсіздіктің сенімді көзі.
Bare ағыны және тар option
Bare React Native үшін балама — application элементіндегі android:usesCleartextTraffic, немесе cleartext-ке тек аталған домендер үшін рұқсат беретін желілік қауіпсіздік конфигурациясы. Доменмен шектелген нысанды таңдаған жөн, өйткені ол ішкі API-ге рұқсат береді және қалғанын HTTPS-те қалдырады. Ол сондай-ақ өзінің ерекшеліктер тізімін құжаттайды, ал шолушы дәл осы бөлік туралы сұрайды.
Екі тәсілдің ешқайсысы сіз атамаған нәрсе үшін платформаның әдепкі мінез-құлқын өзгертпейді.
Алдымен құрылғы журналынан дәлелдеңіз
Конфигурацияны өңдеу алдында нақты сәтсіздікті алыңыз. Қосылған құрылғыдағы adb logcat платформаның cleartext-тен бас тартуын көрсетеді және оны тудырған компонентті атайды. Бас тартылған сокет, шешілмейтін атау немесе сәтсіз TLS қол алысу мүлдем басқа жерді нұсқайды, ал cleartext-ті қосу қолданбаны тек бекер әлсіретер еді.
Содан кейін өндірісті адал ұстаңыз. TLS ұсына алмайтын зертханалық соңғы нүкте үшін cleartext қолайлы, және тек жоспарлай алатын ең қысқа уақытқа ғана. Егер API жеке желі ішінде TLS-ті аяқтай алса, сертификатты құрылғының сенім қоймасына салыңыз және cleartext-ті өшірулі күйде қалдырыңыз, өйткені туннель өз шығысына дейінгі жолды шифрлайды, одан әрі ештеңені емес.
Соңғы нүкте HTTPS-те жауап бере бастаған соң рұқсатты алып тастаңыз, қайта build жасаңыз және сол сессияда VPN-де және қарапайым Wi-Fi-да тексеріңіз. Атауларды шешу осы екі жолда өзгеше болуы мүмкін, және тек жұп қана қайсысы шындықты айтып тұрғанын көрсетеді.