Как заставить charles proxy работать с Android 7 nougat?


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. На моем устройстве lollipop сертификаты перечислены там.

Я использую okhttp3 в качестве HTTP-библиотеки.

есть идеи, что я делаю неправильно ?

4 81

4 ответа:

на основе потока устранения неполадок комментариев для OP, ответ должен установить только сертификат CA прокси как доверенный, а не его cert + закрытый ключ.

проблема была вызвана двумя факторами:

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

  2. Android нуга изменение в поведении Settings -> Security -> Install from storage поток для файлов, которые содержат закрытый ключ в дополнение к сертификатам. Это изменение в поведении разоблачило вышеупомянутую проблему.

до Нуга,Settings -> Security -> Install from storage поток для файлов, содержащих закрытый ключ в дополнение к сертификатам ошибочно установлены сертификаты как доверенные для аутентификации сервера( например, HTTPS, TLS, что делает ваш MiTM успешным), в дополнение к правильной установке как клиентские сертификаты, используемые для аутентификации этого устройства Android на серверах. В Nougat ошибка была исправлена, и эти сертификаты больше не устанавливаются как доверенные для аутентификации сервера. Это предотвращает влияние учетных данных проверки подлинности клиента на безопасность подключений к серверам. В вашем сценарии это препятствует успешному выполнению MiTM.

что усложняет дело в том, что Settings -> Security -> Install from storage не предоставляет явного способа для пользователя указать, устанавливают ли они учетные данные для проверки подлинности клиента (закрытый ключ + цепочка сертификатов) или якорь доверия для проверки подлинности сервера (только сертификат CA-не требуется закрытый ключ). В результате Settings -> Security -> Install from storage поток угадывает, имеет ли он дело с учетными данными аутентификации клиента/пользователя или привязкой доверия аутентификации сервера, предполагая, что, если указан закрытый ключ, это должны быть учетные данные аутентификации клиента/пользователя. В вашем случае неверно предполагается, что вы устанавливаете учетные данные для проверки подлинности клиента / пользователя, а не якорь доверия проверки подлинности сервера.

P. S. Что касается вашей конфигурации сетевой безопасности, вы, вероятно, должны настроить приложение также доверять "системным" якорям доверия в режиме отладки (раздел debug-overrides). В противном случае отладочные сборки приложения не будут работать, если подключения Митм бы доверенным лицом, чей сертификат будет установлен в качестве надежных на устройстве Android.

решение не использовать .p12, просто перейдите с Chrome (с настроенным прокси на wifi) в http://charlesproxy.com/getssl и установите скачанный .файл PEM.

у меня была точно такая же проблема на моем Nexus 5X под управлением Android 7.0. Там был ранее экспортирован .p12 от Charles 3.11.5 (Help->SSL Proxying->Export Charles Root certificate and Private key). Когда я пытался установить .p12 с телефона (Настройки - > Безопасность - >установить из хранилища) он появляется только в разделе " Учетные данные пользователя "и никогда в разделе" доверенные учетные данные", и, конечно же, SSL с Charles proxy не работал.

общее "how-to" для Android 7.0 было бы так:

  1. настройка WiFi + прокси (как требует Чарльз). Подключать его.
  2. на устройстве перейдите с помощью Chrome к http://charlesproxy.com/getssl, принять запрос на загрузку .pem, затем нажмите "Открыть", он запускает " сертификат установщик " приложение. Используйте его для установки сертификата как "VPN и приложения".
  3. поставить атрибут android:networkSecurityConfig="@xml/network_security_config" до <application> в Манифесте.xml
  4. создать res / xml / network_security_config.xml с контентом из первого поста (это совершенно правильно).
  5. запускаем Charles и приложение и получайте удовольствие.

P. S. проверить дату/время на устройстве. Это должно быть правильно.

Я написал скрипт, который вводит apk с необходимыми исключениями и позволяет использовать Charles Proxy с приложением.

Это Github https://github.com/levyitay/AddSecurityExceptionAndroid

Я на 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 и порт номер, а также ссылка на то, где вы должны скачать charles proxy SSL.

в телефоне:

  1. Wifi Settings > Modify Network > Advanced Options. Установите прокси в Manual и введите IP и номер порта вы получили от Чарльза в Proxy hostname и Proxy port соответственно.

  2. (опционально) вы можете или не можете быть в состоянии получить доступ к члс.про/SSL-протокол ссылке, предоставленной Чарльз ранее. На моем устройстве меня всегда уведомляли, что у меня нет сетевого подключения. Я добавил: charlesproxy.com к