Bagaimana cara membuat charles proxy bekerja dengan Android 7 nougat?

101

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 pfxsertifikat dari Settings -> Security -> Install from storage. Sertifikat diperlihatkan User Credentialstetapi 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?

mbonnin.dll
sumber
1
Sebagai pengujian cepat, coba tambahkan / pindahkan userke dalam <base-config>dan lihat apakah perubahan itu penting. Seharusnya tidak, tetapi hanya perlu beberapa saat untuk mencoba.
CommonsWare
Tidakkah Anda perlu menambahkan CA eksplisit untuk Charles di developer.android.com/training/articles/security-config.html : 'Mempercayai CA Tambahan' karena Charles CA adalah yang dibuat sendiri dan tidak akan ada di Rantai kepercayaan Sistem Android?
Morrison Chang
@Morisson Chang: Saya tidak ingin menyematkan Charles CA ke dalam aplikasi, saya ingin dapat menambahkannya secara manual di ponsel pengembangan seperti yang biasa saya lakukan. DariSettings -> Security -> Install from storage
mbonnin
1. Bagaimana Anda mereferensikan network_security_config.xml di AndroidManifest.xml aplikasi Anda? 2. Bisakah Anda menautkan file .pfx? Saya menganggap itu hanya berisi sertifikat CA (tidak ada kunci pribadi) dan dengan demikian seharusnya baik-baik saja untuk dipublikasikan. Saya bertanya karena, jika .pfx berisi kunci pribadi, itu akan dianggap sebagai file sertifikat klien dan dengan demikian CA dari file tidak akan diinstal sebagai dipercaya untuk otentikasi server.
Alex Klyubin
1
@AlexKlyubin hurra, sekarang bekerja :). Saya kira saya perlu me-reboot charles atau aplikasi saya atau hal lain apa pun. Saya bingung karena saya telah menginstal file .pfx yang sama di banyak perangkat Android sebelum nougat dan mereka dikenali dengan baik. Tapi semuanya baik-baik saja sekarang. Bisakah Anda menulis jawaban sehingga saya dapat menyetujuinya?
mbonnin

Jawaban:

26

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:

  1. 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.

  2. Android Nougat mengubah perilaku Settings -> Security -> Install from storagealur untuk file yang berisi kunci pribadi selain sertifikat. Perubahan perilaku ini mengungkap masalah di atas.

Sebelum Nougat, Settings -> Security -> Install from storagealiran 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 storagetidak 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 storagealiran 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.

Alex Klyubin
sumber
1
Mengenai PS: kata dokumentasi 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?
mbonnin
Oh, kamu benar. Anda tidak perlu secara eksplisit mencantumkan anchor kepercayaan "sistem" di debug-overrides.
Alex Klyubin
4
Jawaban ini tidak jelas. Silakan lihat jawaban @ stkent di bawah ini.
Adam Hurwitz
4
Setuju, jawaban ini menjelaskan apa yang sedang terjadi tetapi sangat tidak jelas langkah apa yang harus dilakukan.
StarWind0
114

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:

  1. Konfigurasikan proxy WiFi + (bagaimana Charles membutuhkannya). Hubungkan itu.
  2. Di perangkat, navigasikan dengan Chrome ke http://charlesproxy.com/getssl , terima permintaan untuk mengunduh .pem, lalu tekan "buka", aplikasi "Pemasang sertifikat" akan diluncurkan. Gunakan untuk memasang sertifikat sebagai "VPN dan aplikasi".
  3. Masukan atribut android:networkSecurityConfig="@xml/network_security_config"untuk <application>di manifest.xml
  4. Buat res / xml / network_security_config.xml dengan konten dari posting pertama (itu sepenuhnya benar).
  5. Luncurkan Charles dan aplikasi dan bersenang-senanglah.

PS Periksa tanggal / waktu di perangkat. Itu harus benar.

Alexander Skvortsov
sumber
2
Catatan penting untuk jawaban hebat ini: jika aplikasi Anda menargetkan API 23 atau lebih rendah, Anda tidak memerlukan langkah 3 dan 4. Bahkan Anda tidak akan dapat mengompilasi hal-hal jaringan-keamanan-konfigurasi jika Anda memiliki API 23 atau lebih rendah.
David Ferrand
1
Ini adalah solusi yang bagus untuk Android 7.0. Jauh lebih jelas daripada informasi resmi Charles Proxy.
Adam Link
3
Kemungkinan hanya saya, tetapi langkah-langkah ini tidak berfungsi untuk saya lagi di 7.1.1. Saya baru-baru ini melakukan pembaruan
satyajit
@satyajit Solusi ini berfungsi untuk saya di Android 7.1.1 di Google Pixel.
Dick Lucas
dengan atau tanpa langkah 3 dan 4?
satyajit
-1

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:

  1. 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:

  1. Wifi Settings > Modify Network > Advanced Options. Atur Proxy ke Manualdan masukkan nomor IP dan Port yang Anda terima dari Charles ke Proxy hostnamedan Proxy portmasing - masing.

  2. (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 forlapangan.

  3. 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:

  1. Anda harus mendapatkan prompt ke salah satu Allowatau Denytelepon 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.

Tiffany
sumber