Как заставить работать прокси чарльза с нуга 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 прокси-сервера как доверенный, а не его сертификат + закрытый ключ.

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

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

  2. 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 будет выглядеть так:

  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 Проверьте дату / время на устройстве. Это должно быть правильно.

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

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

У меня также была такая же ошибка, и я пытался всеми способами, пока не прочитал следующее сообщение, которое было ключевым: « Сертификат отображается в учетных данных пользователя, но не в доверенных учетных данных ».

Таким образом, проблема заключалась в том, как сделать так, чтобы сертификат отображался там, и я выполнил следующие шаги:

  1. Загрузите сертификат в эмулятор с http://chls.pro/ssl
  2. Установите сертификат и доверие
  • Настройка приложения -> Безопасность -> Шифрование и учетные данные -> Установить сертификат -> Выбрать вариант сертификата ЦС
  • Выберите «Все равно установить»

  • Выберите прокси-сертификат Charles, который вы загрузили в хранилище.
  1. Убедитесь, что вы доверяете сертификату
  • Откройте «Доверенные учетные данные» -> вкладка «Пользователь», и вы можете увидеть свой сертификат здесь.
  1. Начать перехват 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:

  1. Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser, На этом шаге вы получите IP-адрес прокси-сервера и номер порта, а также ссылку, по которой вы должны скачать SSL-прокси Charles.

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

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

  2. (НЕОБЯЗАТЕЛЬНО) Вы можете или не можете получить доступ к ссылке http://chls.pro/ssl, предоставленной ранее Чарльзом. На моем устройстве меня всегда уведомляли, что у меня нет сетевого подключения. Я добавил charlesproxy.com в Bypass proxy for поле.

  3. В браузере перейдите по ссылке на шаге 3 и загрузите любой необходимый сертификат (если он не работает в Chrome, загрузите Dolphin Browser). Вы можете назвать свой сертификат любым именем.

Вернемся к Чарльзу Прокси:

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

Теперь вы можете использовать Charles на нуге 7.1.1.

Другие вопросы по тегам