В целях обеспечения качественного процесса тестирования мобильных приложений, не следует ограничиваться лишь анализом внешнего поведения программ.
Анализ трафика
Просмотр трафика позволяет глубже погрузиться в оценку функциональности, выявить дефекты, обнаружить которые визуально не представляется возможным, а также точнее диагностировать причины их возникновения. Для анализа трафика мы применяем трафик-снифферы (в нашем случае это, Charles Proxy). Достаточно подключить приложение к прокси, установить на телефон пользовательский сертификат сниффера, включить чтение SSL-прокси – и мы в игре.
Анализ трафика на Android
Данный подход ранее работал на Android без проблем, однако начиная с версии Android 7 (API 24) в ОС были внесены изменения. Теперь по умолчанию мы не можем получить доступ к трафику приложений используя пользовательский сертификат, это возможно только с системными сертификатами.
- Рисунок 1 — Пользовательский сертификат от Charles Proxy
- Рисунок 2 — Системные сертификаты
Что делать в подобной ситуации?
Для этого вам понадобится доступ к исходному коду вашего приложения. В него нужно сначала добавить файл конфигурации безопасности в Android манифест:
<?xml version="1.0" encoding="utf-8"?>
...
<app ...>
<meta-data android:name="android.security.net.config"
android:resource="@xml/network_security_config" />
...
</app>
Функция конфигурации сетевой безопасности использует формат файлов XML. Общая структура файла показана ниже:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="..."/>
...
</trust-anchors>
</base-config>
<domain-config>
<domain>android.com</domain>
...
<trust-anchors>
<certificates src="..."/>
...
</trust-anchors>
<pin-set>
<pin digest="...">...</pin>
...
</pin-set>
</domain-config>
...
<debug-overrides>
<trust-anchors>
<certificates src="..."/>
...
</trust-anchors>
</debug-overrides>
</network-security-config>
Использование пользовательских сертификатов
Оптимальным решением данной проблемы будет разрешение использования пользовательских сертификатов для отладочных сборок. Для этого мы воспользуемся переопределениями debug-overrides. Они применяются, когда параметр android:debuggable имеет значение «true”. Якоря доверия, указанные в debug-overrides, добавляются ко всем другим конфигурациям. Прикрепление сертификатов не выполняется, если цепочка сертификатов сервера использует один из этих якорей доверия, предназначенных только для отладки. Если параметр android:debuggable имеет значение «false», этот раздел полностью игнорируется.
Там мы указываем использование и системных и пользовательских сертификатов:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<debug-overrides>
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
После этого, мы сможем полноценно тестировать наше приложение на debug-сборках, при этом боевые сборки по-прежнему не будут предоставлять доступ к трафику приложения, что важно для безопасности данных пользователя.