Aplikasi Expo gagal HTTP pada Android 9: ini cleartext, bukan VPN
Binaan Expo yang memanggil API HTTP biasa gagal pada Android 9 dan seterusnya. Terowong itu tidak bersalah: flag cleartext terletak dalam konfigurasi binaan.
Anda mengeluarkan binaan baharu, bertukar ke VPN, dan skrin yang sama berhenti dimuatkan. Pada Android 9 dan seterusnya penjelasan yang lebih biasa lebih membosankan: platform menolak HTTP biasa untuk aplikasi yang menyasarkan API 28 atau lebih tinggi, dan VPN hanya mengubah cukup konteks untuk mendedahkannya. Ralat yang anda lihat bergantung pada klien HTTP, sebab itu ia sangat jarang menyebut cleartext.
Apakah kegagalan ini sebenarnya
Sejak Android 9 platform menyekat cleartext secara lalai sebaik sahaja aplikasi menyasarkan tahap API 28 atau lebih tinggi. Permintaan ke alamat HTTP biasa ditolak oleh platform sebelum satu paket pun meninggalkan peranti. Ralat mana yang anda lihat bergantung pada pustaka HTTP: kadang kegagalan rangkaian umum, kadang tamat masa, kadang mesej yang menyebut cleartext secara terus. Apa yang ia tidak pernah lakukan ialah sampai ke pelayan anda. Android mendokumenkan lalai dan alternatif terhad domain dalam panduan konfigurasi keselamatan-nya.
Pelayar pada peranti yang sama masih boleh memuatkan halaman itu, dan itulah petunjuk yang kebanyakan orang terlepas pandang. Pelayar tidak tertakluk kepada dasar keselamatan rangkaian aplikasi anda.
Mengapa VPN dipersalahkan
Biasanya tiga perkara berubah serentak. Aplikasi mungkin menyelesaikan nama hos yang berbeza selepas VPN disambungkan, peranti mungkin baharu dengan binaan yang lebih baharu, atau binaan itu sendiri mungkin telah beralih ke tahap API sasaran yang mencetuskan lalai. VPN kelihatan dan SDK sasaran tidak, jadi VPN mendapat tiket.
Bandingkan tahap sasaran binaan lama dan baharu sebelum menyentuh konfigurasi rangkaian. Aplikasi yang menyasarkan 27 atau lebih rendah dikecualikan, dan itu menjelaskan setiap laporan «ia berfungsi pada telefon lama saya».
Ke mana flag Expo sebenarnya mendarat
Dalam projek Expo terurus, menambah tetapan pada app.json tidak menyunting manifes Android, kerana prebuild dan binaan pembangunan yang menghasilkan manifes itu. Pemalam konfigurasi ialah yang menulis tetapan itu pada peringkat tersebut. Laluan yang disokong ialah expo-build-properties, dikonfigurasikan dalam konfigurasi aplikasi dengan pilihan cleartext di bawah android.
{
"plugins": [
["expo-build-properties", {
"android": { "usesCleartextTraffic": true }
}]
]
}Coretan itu hanya menetapkan pilihan pemalam; manifes dihasilkan kemudian. Jalankan prebuild atau binaan klien pembangunan yang baharu, kemudian sebelum menguji semula periksa AndroidManifest.xml yang dihasilkan untuk android:usesCleartextTraffic, kerana muat semula dengan JS sahaja mengekalkan manifes lama. Padankan versi pemalam dengan Expo SDK tempat projek berjalan. Pilihan pemalam berubah antara keluaran, dan coretan yang disalin daripada SDK lain ialah sumber no-op senyap yang boleh dipercayai.
Aliran bare dan pilihan yang lebih sempit
Untuk bare React Native persamaannya ialah android:usesCleartextTraffic pada elemen application, atau konfigurasi keselamatan rangkaian yang membenarkan cleartext hanya untuk domain yang dinamakan. Bentuk terhad domain ialah yang patut diutamakan, kerana ia membenarkan API dalaman dan membiarkan segala-galanya pada HTTPS. Ia juga mendokumenkan senarai pengecualiannya sendiri, dan itulah bahagian yang akan ditanya oleh penyemak.
Kedua-dua pendekatan tidak mengubah lalai platform untuk apa-apa yang anda tidak namakan.
Buktikan dahulu daripada log peranti
Sebelum menyunting konfigurasi, dapatkan kegagalan yang tepat. adb logcat pada peranti yang disambungkan menunjukkan penolakan cleartext oleh platform dan menamakan komponen yang mencetuskannya. Soket yang ditolak, nama yang tidak dapat diselesaikan atau jabat tangan TLS yang gagal menunjuk ke tempat yang sama sekali lain, dan mengaktifkan cleartext hanya akan melemahkan aplikasi tanpa sebab.
Kemudian kekalkan pengeluaran dengan jujur. Cleartext boleh diterima untuk titik akhir makmal yang tidak dapat menawarkan TLS, dan hanya untuk tempoh paling singkat yang anda dapat jadualkan. Jika API boleh menamatkan TLS di dalam rangkaian peribadi, letakkan sijil dalam stor kepercayaan peranti dan biarkan cleartext dilumpuhkan, kerana terowong menyulitkan laluan sehingga pintu keluarnya dan tiada apa selepas itu.
Sebaik sahaja titik akhir menjawab melalui HTTPS, buang kebenaran itu, bina semula dan uji pada VPN dan pada Wi-Fi biasa dalam sesi yang sama. Penyelesaian nama boleh berbeza antara kedua-dua laluan itu, dan hanya pasangan itu memberitahu anda mana satu yang berkata benar.