Expo-ის აპი Android 9-ზე HTTP-ზე მარცხდება: მიზეზი cleartext-ია და არა VPN
Expo-ის build, რომელიც ჩვეულებრივ HTTP API-ს იძახებს, მარცხდება Android 9-სა და უფრო ახალზე. გვირაბი უდანაშაულოა: cleartext-ის დროშა build-ის კონფიგურაციაშია.
გამოუშვით ახალი build, გადახვედით VPN-ზე და იგივე ეკრანი აღარ იტვირთება. Android 9-სა და უფრო ახალზე უფრო გავრცელებული ახსნა უფრო მოსაწყენია: პლატფორმა უარყოფს ჩვეულებრივ HTTP-ს იმ აპებისთვის, რომლებიც მიზნად ისახავს API 28-ს ან უფრო მაღალს, VPN-მა კი მხოლოდ იმდენი კონტექსტი შეიცვალა, რომ ეს გამოაშკარავდეს. თქვენ მიერ დანახული შეცდომა HTTP კლიენტზეა დამოკიდებული, ამიტომ ის ასე იშვიათად ამბობს cleartext-ს.
რა არის ეს მარცხი სინამდვილეში
Android 9-იდან პლატფორმა ნაგულისხმევად ბლოკავს cleartext-ს, როგორც კი აპი მიზნად ისახავს API დონეს 28 ან უფრო მაღალს. პლატფორმა უარყოფს ჩვეულებრივ 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, რომელიც აპის კონფიგურაციაში cleartext ოფციით android-ის ქვეშ კონფიგურდება.
{
"plugins": [
["expo-build-properties", {
"android": { "usesCleartextTraffic": true }
}]
]
}ნაწყვეტი მხოლოდ პლაგინის ოფციას აყენებს; მანიფესტი მოგვიანებით იქმნება. გაუშვით prebuild ან ახალი development-client build, შემდეგ ხელახლა ტესტირებამდე შეამოწმეთ შექმნილი AndroidManifest.xml android:usesCleartextTraffic-ისთვის, რადგან მხოლოდ JS-ით გადატვირთვა ძველ მანიფესტს ინახავს. შეუსაბამეთ პლაგინის ვერსია იმ Expo SDK-ს, რომელზეც პროექტი მუშაობს. პლაგინის ოფციები გამოშვებებს შორის იცვლება და სხვა SDK-დან კოპირებული ნაწყვეტი ჩუმი უმოქმედობის საიმედო წყაროა.
Bare ნაკადი და უფრო ვიწრო ვარიანტი
bare React Native-ისთვის ეკვივალენტია android:usesCleartextTraffic application ელემენტზე, ან ქსელური უსაფრთხოების კონფიგურაცია, რომელიც cleartext-ს მხოლოდ დასახელებული დომენებისთვის უშვებს. დომენით შეზღუდული ფორმაა სასურველი, რადგან ის შიდა API-ს უშვებს და დანარჩენ ყველაფერს HTTPS-ზე ტოვებს. ის ასევე აღრიცხავს საკუთარ გამონაკლისების სიას და სწორედ ამ ნაწილზე იკითხავს მიმომხილველი.
არც ერთი მიდგომა არ ცვლის პლატფორმის ნაგულისხმევ ქცევას იმისთვის, რაც არ დაგისახელებიათ.
ჯერ მოწყობილობის ლოგიდან დაამტკიცეთ
კონფიგურაციის რედაქტირებამდე ზუსტი მარცხი მიიღეთ. დაკავშირებულ მოწყობილობაზე adb logcat აჩვენებს პლატფორმის cleartext-უარის თქმას და ასახელებს იმ კომპონენტს, რომელმაც ის გამოიწვია. უარყოფილი სოკეტი, გადაუწყვეტელი სახელი ან წარუმატებელი TLS ხელის ჩამორთმევა სულ სხვა ადგილისკენ მიუთითებს და cleartext-ის ჩართვა აპს უსაფუძვლოდ მხოლოდ დაასუსტებდა.
შემდეგ პროდაქშენი პატიოსნად შეინარჩუნეთ. cleartext მისაღებია ლაბორატორიული ბოლო წერტილისთვის, რომელსაც TLS-ის შეთავაზება არ შეუძლია, და მხოლოდ იმ უმოკლეს დროით, რომლის დაგეგმვაც შეგიძლიათ. თუ API-ს TLS-ის დასრულება კერძო ქსელის შიგნით შეუძლია, სერტიფიკატი მოწყობილობის ნდობის საცავში ჩადეთ და cleartext გამორთული დატოვეთ, რადგან გვირაბი გზას მის გასასვლელამდე შიფრავს და მის შემდეგ არაფერს.
როგორც კი ბოლო წერტილი HTTPS-ზე უპასუხებს, მოხსენით ნებართვა, ხელახლა ააწყვეთ და იმავე სესიაში გამოსცადეთ VPN-სა და ჩვეულებრივ Wi-Fi-ზე. სახელების გადაწყვეტა ამ ორ გზაზე შეიძლება განსხვავდებოდეს და მხოლოდ წყვილი გეტყვით, რომელი ამბობს სიმართლეს.