В 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.
Есть идеи, что я делаю неправильно?
источник
user
в<base-config>
и посмотреть, изменится ли это. Этого не должно быть, но нужно всего лишь мгновение, чтобы попробовать.Settings -> Security -> Install from storage
Ответы:
Основываясь на цепочке комментариев по устранению неполадок для OP, ответ состоит в том, чтобы установить только сертификат CA прокси-сервера как доверенный, а не его сертификат + закрытый ключ.
Проблема была вызвана двумя факторами:
Установка не только сертификата CA прокси-сервера MiTM, но и его закрытого ключа (что позволяет приложениям 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
поток догадывается, имеет ли он дело с учетными данными аутентификации клиента / пользователя или якорем доверия аутентификации сервера, предполагая, что, если указан закрытый ключ, он должен быть учетными данными аутентификации клиента / пользователя. В вашем случае неправильно предполагалось, что вы устанавливаете учетные данные аутентификации клиента / пользователя, а не якорь доверия аутентификации сервера.PS Что касается конфигурации сетевой безопасности, вам, вероятно, следует настроить приложение так, чтобы оно также доверяло "системным" якорям доверия в режиме отладки (раздел отладки-переопределения). В противном случае отладочные сборки приложения не будут работать, если соединения не будут установлены через MiTM прокси-сервером, сертификат CA которого установлен как доверенный на устройстве Android.
источник
Trust anchors specified in debug-overrides are added to all other configurations
. Итак, у меня создалось впечатление, что он добавлен в 'base-config', а не заменил его полностью?Решение - не использовать .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 будет таким:
android:networkSecurityConfig="@xml/network_security_config"
к<application>
в Manifest.xmlPS Проверьте дату / время на устройстве. Это должно быть правильно.
источник
Для меня прокси SSL не работал в
release
варианте сборки. Вdebug
сработал.источник
nework_security_config.xml
( developer.android.com/training/articles/security-config )Я использую Android 7.1.1, вот как я настраиваюсь на своем устройстве (OnePlus One) - без изменения манифеста (я ориентировался на API 21 для своего приложения):
В Charles Proxy:
Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browser
. Эти шаги дают вам IP-адрес и номер порта прокси, а также ссылку на то, где вы должны загрузить SSL-прокси charles.На вашем телефоне:
Wifi Settings > Modify Network > Advanced Options
. Установите для прокси значениеManual
и введите IP-адрес и номер порта, полученные от Чарльза, вProxy hostname
иProxy port
соответственно.(НЕОБЯЗАТЕЛЬНО) Вы можете или не можете получить доступ к ссылке chls.pro/ssl, предоставленной Чарльзом ранее. На моем устройстве меня всегда уведомляли об отсутствии сетевого подключения. Я добавил в поле charlesproxy.com
Bypass proxy for
.В браузере перейдите по ссылке на шаге 3 и загрузите необходимый сертификат (если он не работает в Chrome, загрузите браузер Dolphin). Вы можете назвать свой сертификат любым именем.
Вернемся к Чарльзу Прокси:
Allow
или наDeny
вашем телефоне, если в ваших настройках по умолчанию запрашиваются удаленные подключения.Теперь вы можете использовать Charles на Nougat 7.1.1.
источник