Android 7 memperkenalkan beberapa perubahan pada cara penanganan sertifikat ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html ) dan entah bagaimana saya tidak dapat membuat proxy Charles saya berfungsi lagi.
Network_security_config.xml saya:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
<debug-overrides>
<trust-anchors>
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
Saya menjalankan dalam mode debug. Tapi tidak peduli apa, aku mengerti javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
.
Tak perlu dikatakan, saya memang memasang pfx
sertifikat dari Settings -> Security -> Install from storage
. Sertifikat diperlihatkan User Credentials
tetapi tidak dalam Trusted credentials -> User
. Di perangkat lollipop saya, sertifikatnya terdaftar di sana.
Saya menggunakan okhttp3 sebagai pustaka HTTP.
Tahu apa yang saya lakukan salah?
sumber
user
ke dalam<base-config>
dan lihat apakah perubahan itu penting. Seharusnya tidak, tetapi hanya perlu beberapa saat untuk mencoba.Settings -> Security -> Install from storage
Jawaban:
Berdasarkan utas pemecahan masalah komentar untuk OP, jawabannya adalah menginstal hanya sertifikat CA proxy sebagai tepercaya, bukan sertifikat + kunci pribadinya.
Masalahnya disebabkan oleh dua faktor:
Menginstal tidak hanya sertifikat CA proxy MiTM tetapi juga kunci pribadinya (sehingga memungkinkan aplikasi VPN pada perangkat untuk mendekripsi / lalu lintas jaringan MiTM dari aplikasi lain). Anda tidak memerlukan kunci pribadi proxy MiTM di perangkat.
Android Nougat mengubah perilaku
Settings -> Security -> Install from storage
alur untuk file yang berisi kunci pribadi selain sertifikat. Perubahan perilaku ini mengungkap masalah di atas.Sebelum Nougat,
Settings -> Security -> Install from storage
aliran untuk file yang berisi kunci pribadi selain sertifikat secara keliru menginstal sertifikat sebagai tepercaya untuk otentikasi server (misalnya, HTTPS, TLS, sehingga membuat MiTM Anda berhasil), selain diinstal dengan benar sebagai sertifikat klien yang digunakan untuk mengautentikasi perangkat Android ini ke server. Di Nougat, bug telah diperbaiki dan sertifikat ini tidak lagi diinstal sebagai tepercaya untuk otentikasi server. Ini mencegah kredensial otentikasi klien mempengaruhi (melemahkan) keamanan koneksi ke server. Dalam skenario Anda, ini mencegah MiTM Anda berhasil.Yang memperumit masalah adalah bahwa
Settings -> Security -> Install from storage
tidak menyediakan cara eksplisit bagi pengguna untuk menentukan apakah mereka menginstal kredensial otentikasi klien (kunci pribadi + rantai sertifikat) atau jangkar kepercayaan otentikasi server (hanya sertifikat CA - tidak diperlukan kunci pribadi) . Akibatnya,Settings -> Security -> Install from storage
aliran menebak apakah itu berhubungan dengan kredensial otentikasi klien / pengguna atau jangkar kepercayaan otentikasi server dengan mengasumsikan bahwa, jika kunci pribadi ditentukan, itu pasti kredensial otentikasi klien / pengguna. Dalam kasus Anda, itu salah mengasumsikan bahwa Anda menginstal kredensial otentikasi klien / pengguna daripada jangkar kepercayaan otentikasi server.PS Sehubungan dengan Konfigurasi Keamanan Jaringan, Anda mungkin harus mengonfigurasi aplikasi untuk juga mempercayai jangkar kepercayaan "sistem" dalam mode debug (bagian menimpa debug). Jika tidak, build debug aplikasi tidak akan berfungsi kecuali jika koneksi di-MiTM oleh proxy yang sertifikat CA-nya diinstal sebagai tepercaya di perangkat Android.
sumber
Trust anchors specified in debug-overrides are added to all other configurations
. Jadi saya mendapat kesan bahwa itu ditambahkan ke 'base-config' dan tidak menggantinya sepenuhnya?Solusinya jangan gunakan .p12 , cukup navigasikan dengan Chrome (dengan proxy yang dikonfigurasi pada wifi) ke http://charlesproxy.com/getssl dan instal file .pem yang diunduh .
Saya mengalami masalah yang persis sama pada Nexus 5X saya yang menjalankan Android 7.0. Sebelumnya ada .p12 yang diekspor dari Charles 3.11.5 (Bantuan-> SSL Proxying-> Ekspor sertifikat Root Charles dan kunci Pribadi). Ketika saya mencoba menginstal .p12 dari ponsel (Pengaturan-> Keamanan-> Instal dari penyimpanan), itu hanya muncul di bawah "Kredensial pengguna" dan tidak pernah di "Kredensial tepercaya", dan tentu saja SSL dengan proxy Charles tidak berfungsi.
Total "cara" untuk Android 7.0 akan seperti itu:
android:networkSecurityConfig="@xml/network_security_config"
untuk<application>
di manifest.xmlPS Periksa tanggal / waktu di perangkat. Itu harus benar.
sumber
Saya menggunakan Android 7.1.1, berikut cara saya menyiapkan di perangkat saya (OnePlus One) - tanpa perubahan manifes (saya menargetkan API 21 untuk aplikasi saya):
Di Charles Proxy:
Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser
. Langkah-langkah ini memberi Anda IP proxy dan nomor port dan juga tautan ke mana Anda harus mengunduh charles proxy SSL.Di ponsel Anda:
Wifi Settings > Modify Network > Advanced Options
. Atur Proxy keManual
dan masukkan nomor IP dan Port yang Anda terima dari Charles keProxy hostname
danProxy port
masing - masing.(OPSIONAL) Anda mungkin atau mungkin tidak dapat mengakses tautan chls.pro/ssl yang disediakan oleh Charles sebelumnya. Di perangkat saya, saya selalu diberi tahu bahwa saya tidak memiliki koneksi jaringan. Saya menambahkan charlesproxy.com ke
Bypass proxy for
lapangan.Di browser Anda, buka link di langkah 3 dan unduh sertifikat apa pun yang diperlukan (jika tidak berfungsi di Chrome, unduh Dolphin Browser). Anda dapat menamai sertifikat Anda dengan nama apa pun.
Kembali ke Charles Proxy:
Allow
atauDeny
telepon Anda untuk menggunakan proxy jika pengaturan Anda secara default meminta Anda untuk koneksi jarak jauh.Sekarang Anda dapat menggunakan Charles di Nougat 7.1.1.
sumber