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

102

В 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.

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

mbonnin
источник
1
В качестве быстрого теста попробуйте добавить / переместить его userв <base-config>и посмотреть, изменится ли это. Этого не должно быть, но нужно всего лишь мгновение, чтобы попробовать.
CommonsWare
Разве вам не нужно было бы добавить явный ЦС для Чарльза в developer.android.com/training/articles/security-config.html : «Доверие дополнительным ЦС», поскольку ЦС Charles является самогенерируемым и не будет в Цепочка доверия системы Android?
Моррисон Чанг,
@Morisson Chang: Я не хочу встраивать Charles CA в приложение, я хочу иметь возможность добавлять его вручную на свой телефон разработчика, как это делал раньше. ОтSettings -> Security -> Install from storage
mbonnin
1. Как вы ссылаетесь на network_security_config.xml в AndroidManifest.xml вашего приложения? 2. Не могли бы вы связать файл .pfx? Я предполагаю, что он содержит только сертификат CA (без закрытых ключей) и поэтому его можно опубликовать. Я спрашиваю, потому что, если .pfx содержит закрытый ключ, предполагается, что это файл сертификата клиента, и поэтому CA из файла не будет установлен как доверенный для проверки подлинности сервера.
Alex Klyubin
1
@AlexKlyubin ура, теперь работает :). Я думаю, мне нужно было перезагрузить мой charles или приложение или что-то еще. Я был сбит с толку, потому что я установил один и тот же файл .pfx на бесчисленное количество устройств Android до nougat, и они были признаны нормально. Но сейчас все хорошо. Не могли бы вы написать ответ, чтобы я его одобрил?
mbonnin

Ответы:

26

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

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

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

  2. 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поток догадывается, имеет ли он дело с учетными данными аутентификации клиента / пользователя или якорем доверия аутентификации сервера, предполагая, что, если указан закрытый ключ, он должен быть учетными данными аутентификации клиента / пользователя. В вашем случае неправильно предполагалось, что вы устанавливаете учетные данные аутентификации клиента / пользователя, а не якорь доверия аутентификации сервера.

PS Что касается конфигурации сетевой безопасности, вам, вероятно, следует настроить приложение так, чтобы оно также доверяло "системным" якорям доверия в режиме отладки (раздел отладки-переопределения). В противном случае отладочные сборки приложения не будут работать, если соединения не будут установлены через MiTM прокси-сервером, сертификат CA которого установлен как доверенный на устройстве Android.

Алексей Клюбин
источник
1
По поводу PS: в документации сказано Trust anchors specified in debug-overrides are added to all other configurations. Итак, у меня создалось впечатление, что он добавлен в 'base-config', а не заменил его полностью?
mbonnin
О, ты прав. Вам не нужно явно указывать «системные» якоря доверия в переопределениях отладки.
Alex Klyubin
4
Этот ответ неясен. См. Ответ @stkent ниже.
Адам Гурвиц
4
Согласитесь, этот ответ объясняет, что происходит, но очень неясно, какие шаги следует предпринять.
StarWind0
115

Решение - не использовать .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 and Private key). Когда я пытался установить .p12 с телефона (Настройки-> Безопасность-> Установить из хранилища), он появлялся только в разделе «Учетные данные пользователя» и никогда в разделе «Доверенные учетные данные», и, конечно же, SSL с прокси-сервером Charles не работал.

Общее руководство для Android 7.0 будет таким:

  1. Настройте Wi-Fi + прокси (как этого требует Чарльз). Подключите это.
  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. Запустите Charles и приложение и получайте удовольствие.

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

Александр Скворцов
источник
2
Важное замечание по этому замечательному ответу: если ваше приложение нацелено на API 23 или ниже, вам не нужны шаги 3 и 4. На самом деле вы не сможете скомпилировать материал конфигурации сетевой безопасности, если у вас есть API 23 или ниже.
Дэвид Ферран
1
Это отличное решение для Android 7.0. Намного яснее, чем официальная информация Чарльза Прокси.
Adam Link
3
Скорее всего, только я, но эти шаги больше не работают для меня в 7.1.1. Я недавно сделал обновление
Satyajit
@satyajit У меня это решение работает на Android 7.1.1 на Google Pixel.
Дик Лукас
с шагами 3 и 4 или без них?
Satyajit
-1

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

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

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

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

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

Тиффани
источник