Як змусити charles proxy працювати з Android 7 нуга?


101

Android 7 внесла деякі зміни в обробку сертифікатів ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html ), і я якось більше не можу змусити проксі-сервера Чарльза працювати.

My network_security_config.xml:

<?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>

Я працюю в режимі налагодження. Але незважаючи ні на що, я отримую javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found..

Потрібно сказати, що я встановив pfxсертифікат від Settings -> Security -> Install from storage. Сертифікат відображається в, User Credentialsале не в Trusted credentials -> User. На моєму льодяниковому пристрої сертифікати вказані там.

Я використовую okhttp3 як бібліотеку HTTP.

Будь-яка ідея, що я роблю неправильно?


1
Як швидкий тест, спробуйте додати / перемістити його userв <base-config>і переконатися, що це має значення. Це не повинно, але для спробування знадобиться лише хвилина.
CommonsWare

Чи не вам потрібно буде додавати явний сертифікат для Чарльза в developer.android.com/training/articles/security-config.html : "Довіряти додатковим CA", оскільки Charles CA - це власне генерований, і він не буде в Довірна мережа Android System?
Моррісон Чанг

@Morisson Chang: Я не хочу вбудовувати додаток Charles CA у додаток, я хочу мати можливість додавати його вручну на свій телефон для розробки, як я раніше. ВідSettings -> Security -> Install from storage
mbonnin

1. Як ви посилаєтесь на network_security_config.xml у програмі AndroidManifest.xml вашого додатка? 2. Чи бажаєте ви зв’язати файл .pfx? Я припускаю, що він містить лише сертифікат CA (немає приватних ключів), і тому слід публікувати. Я запитую, тому що, якщо .pfx містить приватний ключ, він вважатиметься файлом cert клієнта, і, таким чином, CA з цього файлу не буде встановлено як довірений для автентифікації сервера.
Олексій Клюбін

1
@AlexKlyubin hurra, це працює зараз :). Напевно, мені потрібно було перезавантажити шарли чи додаток чи будь-яку іншу річ. Мене розгубило, тому що я встановив той самий файл .pfx на незліченних Android-пристроях перед nougat, і вони були визнані нормально. Але зараз все добре. Чи можете ви написати відповідь, щоб я міг її схвалити?
mbonnin

Відповіді:


26

Виходячи з теми усунення несправностей коментарів до ОП, відповідь полягає в тому, щоб встановити лише сертифікат CA проксі як довірений, а не його cert + приватний ключ.

Проблему викликали два фактори:

  1. Встановлення не лише сертифікату CA проксі-сервера MiTM, але і його приватного ключа (таким чином, додатки VPN на пристрої можуть дешифрувати / мережевий трафік MiTM з інших додатків). Вам не потрібен приватний ключ проксі-сервера MiTM на пристрої.

  2. Android Nougat змінює поведінку Settings -> Security -> Install from storageпотоку для файлів, які містять приватний ключ, крім cert (s). Ця зміна поведінки розкрила вищезгадане питання.

Перед Nougat, Settings -> Security -> Install from storageпотік для файлів, що містять приватний ключ, крім certs, помилково встановив certs як довірену для аутентифікації сервера (наприклад, HTTPS, TLS, завдяки чому ваш MiTM є успішним), крім того, що він правильно встановлений як клієнтські серти, що використовуються для аутентифікація цього пристрою Android на серверах. У Nougat помилка була виправлена, і ці сертифікати більше не встановлюються як надійні для автентифікації сервера. Це запобігає впливові облікові дані клієнтів аутентифікації (послаблюють) безпеку з'єднань із серверами. У вашому сценарії це не дозволяє вашому MiTM досягти успіху.

Що ускладнює питання, це те, що Settings -> Security -> Install from storageвін не дає явного способу для користувача визначати, чи встановлює він обліковий запис автентифікації клієнта (приватний ключ + ланцюг cert) або довіру довіри автентифікації сервера (просто сертифікат CA - не потрібен приватний ключ) . Як результат, Settings -> Security -> Install from storageпотік здогадується, чи стосується він клієнт / користувальницький обліковий запис автентифікації або сервер автентифікації довіри, припускаючи, що якщо вказано приватний ключ, він повинен бути обліковим записом автентифікації клієнт / користувач. У вашому випадку помилково припускається, що ви встановлюєте обліковий запис автентифікації клієнта / користувача, а не довіру довіри до автентифікації сервера.

PS Що стосується вашої налаштування мережевої безпеки, ви, ймовірно, повинні налаштувати додаток так само, щоб довіряти «системним» якорям довіри в режимі налагодження (розділ відміни помилок). В іншому випадку налагодження програми не працюватиме, якщо з'єднання не буде MiTM'd проксі-сервером, чий сертифікат CA встановлений як надійний на пристрої Android.


1
Щодо ПС: документація говорить Trust anchors specified in debug-overrides are added to all other configurations. Тож у мене було враження, що він додав до 'base-config' і не замінив його повністю?
mbonnin

О, ти маєш рацію. Вам не потрібно чітко перераховувати «системні» довіри в перестановках налагодження.
Олексій Клюбін

4
Ця відповідь незрозуміла. Будь ласка, зверніться до відповіді @ stkent нижче.
Адам Гурвіц

4
Погодьтеся, ця відповідь пояснює, що відбувається, але дуже незрозуміло, які кроки потрібно зробити.
StarWind0

114

Рішення не використовувати .p12 , просто перейдіть за допомогою Chrome (з налаштованим проксі на wifi) на http://charlesproxy.com/getssl та встановіть завантажений .pem файл .

У мене була точно така ж проблема на моєму Nexus 5X під управлінням Android 7.0. Раніше було експортовано .p12 з Charles 3.11.5 (довідка-> SSL Proxying-> Експорт сертифіката Charles Root та приватний ключ). Коли я намагався встановити .p12 з телефону (Налаштування-> Безпека-> Встановити зі сховища), він відображається лише у розділі "Вхідні дані користувачів" і ніколи в "Довірених облікових даних", і звичайно SSL з проксі-сервером Чарльза не працював.

Загальний "як" для Android 7.0 виглядатиме так:

  1. Налаштування проксі-сервера WiFi + (як цього вимагає Чарльз). Підключіть його.
  2. На пристрої перейдіть за допомогою Chrome до http://charlesproxy.com/getssl , прийміть запит на завантаження .pem, потім натисніть "відкрити", він запустить додаток "Установник сертифікатів". Використовуйте його для встановлення сертифіката як "VPN та програми".
  3. Помістіть атрибут android:networkSecurityConfig="@xml/network_security_config"до <application>в Manifest.xml
  4. Створіть res / xml / network_security_config.xml із вмістом з першого повідомлення (це абсолютно правильно).
  5. Запустіть Чарльза та додаток та отримайте задоволення.

PS Перевірте дату / час на пристрої. Це повинно бути правильним.


2
Важлива примітка щодо цієї чудової відповіді: якщо ваша програма орієнтована на API 23 або новішої версії, вам не потрібні кроки 3 та 4. Насправді ви не зможете зібрати матеріали конфігурації мережевої безпеки, якщо у вас є API 23 або нижче.
Девід Ферран

1
Це чудове рішення для Android 7.0. Набагато чіткіше, ніж офіційна інформація Чарльза Проксі.
Адам Посилання

3
Напевно, тільки я, але ці кроки для мене більше не працюють в 7.1.1. Нещодавно я робив оновлення
satyajit

@satyajit Це рішення працює для мене на Android 7.1.1 на Google Pixel.
Дік Лукас

з кроками 3 і 4 або без них?
satyajit

-1

Я перебуваю на Android 7.1.1, ось як налаштувати на своєму пристрої (OnePlus One) - без зміни маніфесту (я орієнтувався на API 21 для свого додатка):

У Charles Proxy:

  1. Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser. Цей крок дає вам IP проксі-сервера та номер порту, а також посилання на те, куди слід завантажувати SSL-сервер проксі-сервера.

На своєму телефоні:

  1. Wifi Settings > Modify Network > Advanced Options. Установка проксі для Manualі введіть номер IP і порт, отриманий від Charles в Proxy hostnameі Proxy portвідповідно.

  2. (ДОДАТКОВО) Ви можете або не можете отримати доступ до посилання chls.pro/ssl, наданого раніше Чарльзом. На своєму пристрої мене завжди повідомляли, що у мене немає мережевого зв’язку. Я додав charlesproxy.com до Bypass proxy forполя.

  3. У своєму браузері перейдіть за посиланням на кроці 3 та завантажте необхідний сертифікат (якщо він не працює на Chrome, завантажте браузер Dolphin). Ви можете назвати свій сертифікат будь-яким ім’ям.

Повернутися на Charles Proxy:

  1. Вам слід отримати запит Allowабо на Denyваш телефон, щоб скористатися проксі-сервером, якщо ваші налаштування встановлені за замовчуванням, щоб запропонувати вам віддалене з'єднання.

Тепер ви можете використовувати Charles на Nougat 7.1.1.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.