Как заставить прокси-сервер charles работать с nougat 7 Android?
Android 7 внесла некоторые изменения в способ обработки сертификатов (http://android-developers.blogspot.com/2016/07/changes-to-trusted-certificate.html), и каким-то образом я больше не могу работать с моим прокси-сервером Charles.
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
На основе темы устранения неполадок комментариев для OP ответ заключается в том, чтобы установить только сертификат CA прокси-сервера как доверенный, а не его cert + закрытый ключ.
Проблема была вызвана двумя факторами:
-
Установка не только сертификата CA MiTM proxy, но также и его закрытого ключа (что позволяет VPN-приложениям на устройстве расшифровывать/трафик сети MiTM из других приложений). Вам не нужен секретный ключ прокси-сервера MiTM на устройстве.
-
Android Nougat изменяет поведение потока Settings -> Security -> Install from storage
для файлов, которые содержат закрытый ключ в дополнение к сертификату (-ам). Это изменение в поведении разоблачает вышеупомянутую проблему.
До Nougat поток Settings -> Security -> Install from storage
для файлов, содержащих закрытый ключ в дополнение к сертификатам, ошибочно установил сертификаты как надежные для аутентификации сервера (например, HTTPS, TLS, что сделало ваш MiTM успешным), в дополнение к правильности установленный в качестве клиентских сертификатов, используемых для аутентификации этого устройства Android на серверах. В Nougat ошибка была исправлена, и эти сертификаты больше не установлены в качестве доверенных для аутентификации сервера. Это не позволяет учетным данным проверки подлинности клиента влиять на (безопасность) соединений на серверы. В вашем сценарии это предотвратит успех вашего MiTM.
Что осложняет ситуацию, так это то, что Settings -> Security -> Install from storage
не предоставляет явным образом пользователю указание, устанавливают ли они учетные данные аутентификации клиента (приватный ключ + цепочка сертификатов) или доверенность доверия аутентификации сервера (только сертификат CA - - не нужен секретный ключ). В результате поток Settings -> Security -> Install from storage
догадывается, имеет ли он дело с аутентификацией доверенности клиент/пользователь или доверенность доверия аутентификации сервера, предположив, что, если указан закрытый ключ, он должен быть удостоверением личности клиента/пользователя. В вашем случае неверно предполагалось, что вы устанавливаете учетные данные для проверки подлинности клиента/пользователя, а не доверенность на проверку подлинности сервера.
Р. S. Что касается конфигурации сетевой безопасности, вероятно, вы должны настроить приложение, чтобы также доверять "системным" привязкам доверия в режиме отладки (раздел debug-overrides). В противном случае отладочные сборки приложения не будут работать, если соединения не являются MiTM'd прокси-сервером, чей сертификат CA установлен как надежный на устройстве Android.
Ответ 2
Решение не использует .p12, просто перейдите с помощью Chrome (с настроенным прокси на Wi-Fi) в http://charlesproxy.com/getssl и установить загруженный файл .pem.
У меня была такая же проблема на моем Nexus 5X под управлением Android 7.0.
Ранее был экспортирован .p12 из Charles 3.11.5 (Help- > SSL Proxying- > Export Charles Root certificate и Private key). Когда я попытался установить .p12 с телефона (Настройки- > Безопасность- > Установить из хранилища), он отображается только в разделе "Учетные данные пользователя" и никогда в "Доверенных учетных данных", и, конечно, SSL с прокси-сервером Charles не работал.
Общий "практический" для Android 7.0 будет таким:
- Настройте WiFi + proxy (как это требует Чарльз). Подключите его.
- На устройстве перейдите с Chrome на http://charlesproxy.com/getssl, примите запрос на загрузку .pem, затем нажмите "open", он запускает "Certificate" установщик ". Используйте его для установки сертификата как" VPN и приложения".
- Поместите атрибут
android:networkSecurityConfig="@xml/network_security_config"
в <application>
в Manifest.xml
- Создайте res/xml/network_security_config.xml с контентом из первого сообщения (это абсолютно правильно).
- Запустите Чарльза и приложение и получайте удовольствие.
P.S. Проверьте дату/время на устройстве. Это должно быть правильно.
Ответ 3
Я написал script, которые вводят apk с необходимыми исключениями и позволяют использовать Charles Proxy с приложением.
Это Github https://github.com/levyitay/AddSecurityExceptionAndroid
Ответ 4
Я на Android 7.1.1, здесь, как я устанавливаю на своем устройстве (OnePlus One) - без изменения манифеста (я ориентировал API 21 для своего приложения):
В Карл Прокси:
-
Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser
. На этом этапе вы получите номер прокси-сервера IP и порта, а также ссылку на то, где вы должны загрузить SSL-прокси SSL.
На вашем телефоне:
-
Wifi Settings > Modify Network > Advanced Options
. Установите прокси на Manual
и введите номер IP и порта, который вы получили от Charles, в Proxy hostname
и Proxy port
соответственно.
-
(ДОПОЛНИТЕЛЬНО) Вы можете или не сможете получить доступ к ссылке chls.pro/ssl, предоставленной Чарльзом ранее. На моем устройстве мне всегда сообщалось, что у меня нет сетевого подключения. Я добавил charlesproxy.com в поле Bypass proxy for
.
-
В своем браузере перейдите по ссылке на шаге 3 и загрузите любой необходимый сертификат (если он не работает в Chrome, загрузите браузер Dolphin). Вы можете назвать свой сертификат с любым именем.
Назад на Карл Прокси:
- Вы должны получить приглашение либо на
Allow
, либо на Deny
на свой телефон, чтобы использовать прокси-сервер, если ваши настройки по умолчанию запрошены для удаленных подключений.
Теперь вы можете использовать Charles on Nougat 7.1.1.