Как заставить работать прокси чарльза с нуга Android 7?
В Android 7 внесены некоторые изменения в способ обработки сертификатов ( http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html), и почему-то я не могу заставить свой прокси-сервер Charles работать больше.
Мой 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.
Есть идеи, что я делаю не так?
7 ответов
Исходя из цепочки комментариев по устранению неполадок для OP, ответ заключается в том, чтобы установить только сертификат CA прокси-сервера как доверенный, а не его сертификат + закрытый ключ.
Проблема была вызвана двумя факторами:
Установка не только сертификата CA прокси-сервера MiTM, но и его закрытого ключа (таким образом, позволяя приложениям VPN на устройстве дешифровать сетевой трафик MiTM из других приложений). Вам не нужен личный ключ прокси-сервера MiTM на устройстве.
Android Nougat меняет поведение
Settings -> Security -> Install from storage
поток для файлов, которые содержат закрытый ключ в дополнение к cert(s). Это изменение в поведении разоблачает вышеуказанную проблему.
До нуги, Settings -> Security -> Install from storage
поток для файлов, содержащих закрытый ключ в дополнение к сертификатам, которые ошибочно установили сертификаты в качестве доверенных для аутентификации сервера (например, HTTPS, TLS, что делает ваш MiTM успешным), в дополнение к правильной установке в качестве клиентских сертификатов, используемых для аутентификации этого устройства Android в сервера. В Nougat ошибка была исправлена, и эти сертификаты больше не устанавливаются в качестве доверенных для проверки подлинности сервера. Это не позволяет учетным данным аутентификации клиента влиять (ослаблять) безопасность соединений с серверами. В вашем сценарии это препятствует успешной работе вашего MiTM.
Что усложняет дело, так это то, что Settings -> Security -> Install from storage
не предоставляет пользователю явного способа указать, устанавливают ли они учетные данные аутентификации клиента (личный ключ + цепочка сертификатов) или привязку доверия аутентификации сервера (просто сертификат CA - закрытый ключ не требуется). В результате Settings -> Security -> Install from storage
Поток определяет, имеет ли он дело с учетными данными аутентификации клиента / пользователя или привязкой доверия аутентификации сервера, предполагая, что, если указан закрытый ключ, это должны быть учетные данные аутентификации клиента / пользователя. В вашем случае неправильно предполагалось, что вы устанавливаете учетные данные аутентификации клиент / пользователь, а не якорь доверия аутентификации сервера.
PS Что касается вашей конфигурации сетевой безопасности, вам, вероятно, следует настроить приложение так, чтобы оно также доверяло "системным" якорям доверия в режиме отладки (раздел отладки-переопределения). В противном случае отладочные сборки приложения не будут работать, если подключения не будут выполняться MiTM через прокси-сервер, сертификат CA которого установлен как доверенный на устройстве Android.
Решение - не использовать.p12, просто перейдите с Chrome (с настроенным прокси на wifi) на http://charlesproxy.com/getssl и установите загруженный файл.pem.
У меня была точно такая же проблема на моем Nexus 5X под управлением Android 7.0. Ранее был экспортирован файл.p12 из Charles 3.11.5 (Справка->SSL-проксирование-> Экспорт сертификата и закрытого ключа Charles Root). Когда я пытался установить.p12 с телефона (Настройки-> Безопасность-> Установить из хранилища), он появляется только в разделе "Учетные данные пользователя", а не в "Доверенные учетные данные", и, конечно, SSL с прокси-сервером Charles не работал.
Общее "как" для Android 7.0 будет выглядеть так:
- Настройте WiFi + прокси (как Чарльз требует). Подключи это.
- На устройстве перейдите с Chrome на http://charlesproxy.com/getssl, примите запрос на загрузку.pem, затем нажмите "открыть", запустится приложение "Установщик сертификатов". Используйте его для установки сертификата как "VPN и приложения".
- Поместите атрибут
android:networkSecurityConfig="@xml/network_security_config"
в<application>
на Manifest.xml - Создайте res/xml/network_security_config.xml с контентом из первого поста (это абсолютно правильно).
- Запустите Чарльз и приложение и получайте удовольствие.
PS Проверьте дату / время на устройстве. Это должно быть правильно.
Я написал скрипт, который внедряет apk с необходимыми исключениями и позволяет использовать Charles Proxy с приложением.
Это Github https://github.com/levyitay/AddSecurityExceptionAndroid
У меня также была такая же ошибка, и я пытался всеми способами, пока не прочитал следующее сообщение, которое было ключевым: « Сертификат отображается в учетных данных пользователя, но не в доверенных учетных данных ».
Таким образом, проблема заключалась в том, как сделать так, чтобы сертификат отображался там, и я выполнил следующие шаги:
- Загрузите сертификат в эмулятор с http://chls.pro/ssl
- Установите сертификат и доверие
- Настройка приложения -> Безопасность -> Шифрование и учетные данные -> Установить сертификат -> Выбрать вариант сертификата ЦС
- Выберите «Все равно установить»
- Выберите прокси-сертификат Charles, который вы загрузили в хранилище.
- Убедитесь, что вы доверяете сертификату
- Откройте «Доверенные учетные данные» -> вкладка «Пользователь», и вы можете увидеть свой сертификат здесь.
- Начать перехват HTTPS-трафика
Для меня прокси SSL не работал в release
вариант сборки. Вdebug
работал.
В 2023 году
Стоит отметить, что вам нужен файл сертификата Чарльза, установленный на вашем телефоне Android и существующий в каталоге вашего проекта.
Вот как я заставляю Чарльза работать на Android 12. Один скриншот был бы идеален.
- Поместите файл сертификата (charlescert.pem) в
res/raw/charlescert.pem
. Что ж, если вы не можете загрузить его на свой телефон Android, загрузите его в браузере своего компьютера и загрузите на свой телефон Android.
network_security_config.xml
Если я не добавлю эту строкуtools:ignore="NetworkSecurityConfig"
код будет жаловаться, исходит от разработчика iOS... не уверен в причине.
<?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:tools="http://schemas.android.com/tools">
<base-config>
<trust-anchors>
<certificates src="@raw/charlescert"
tools:ignore="NetworkSecurityConfig" />
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
В конце концов, добавьте<application android:networkSecurityConfig="@xml/network_security_config"...>
в AndroidManifest.xml
Я нахожусь на Android 7.1.1, вот как я настраиваюсь на своем устройстве (OnePlus One) - без изменения манифеста (я настраивал API 21 для своего приложения):
В Charles Proxy:
Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser
, На этом шаге вы получите IP-адрес прокси-сервера и номер порта, а также ссылку, по которой вы должны скачать SSL-прокси Charles.
На вашем телефоне:
Wifi Settings > Modify Network > Advanced Options
, Установите прокси вManual
и введите IP и номер порта, который вы получили от Чарльза вProxy hostname
а такжеProxy port
соответственно.(НЕОБЯЗАТЕЛЬНО) Вы можете или не можете получить доступ к ссылке http://chls.pro/ssl, предоставленной ранее Чарльзом. На моем устройстве меня всегда уведомляли, что у меня нет сетевого подключения. Я добавил charlesproxy.com в
Bypass proxy for
поле.В браузере перейдите по ссылке на шаге 3 и загрузите любой необходимый сертификат (если он не работает в Chrome, загрузите Dolphin Browser). Вы можете назвать свой сертификат любым именем.
Вернемся к Чарльзу Прокси:
- Вы должны получить приглашение либо
Allow
или жеDeny
ваш телефон, чтобы использовать прокси, если ваши настройки по умолчанию запрашивают удаленные подключения.
Теперь вы можете использовать Charles на нуге 7.1.1.