Как заставить прокси-сервер 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.

На вашем телефоне:

  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). Вы можете назвать свой сертификат с любым именем.

Назад на Карл Прокси:

  1. Вы должны получить приглашение либо на Allow, либо на Deny на свой телефон, чтобы использовать прокси-сервер, если ваши настройки по умолчанию запрошены для удаленных подключений.

Теперь вы можете использовать Charles on Nougat 7.1.1.