#okhttp #android-network-security-config
Вопрос:
Я пытаюсь добавить конфигурацию сетевой безопасности, которая ограничивает подключения к серверам, подписанным набором центров сертификации, которые я включил в приложение (на самом деле в библиотеку, используемую приложением). У меня есть существующая настройка, которая работает там, где ЦС загружаются в хранилище доверия. Теперь, когда я добавил конфигурацию сетевой безопасности и попытался ее протестировать, она, похоже, не работает.
Вот что я пытался сделать:
AndroidManifest.xml:
<application
...
android:networkSecurityConfig="@xml/network_security_configuration"
...
network-security-configuration.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
<debug-overrides>
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</debug-overrides>
</network-security-config>
Что я ожидал бы от этой новой конфигурации, так это то, что подключения не разрешены к серверам, подписанным самозаверяющими центрами сертификации, такими как те, которые я включил в комплект. Но когда я запускаю приложение, соединения работают нормально, поэтому конфигурация сетевой безопасности, похоже, не работает…
Что я в конечном счете хотел бы сделать, так это добавить свой CAs в якоря доверия:
<certificates src="@raw/my_ca" />
Моя настройка,
приложение:
- Плагин для Android-приложения Gradle 7.0
- Таргетинг API 30
Библиотека:
- Плагин для Android-приложения Gradle 7.0
- Таргетинг API 30
Телефон:
- Samsung Galaxy S20
- Android 11 (=API 30)
Почему конфигурация сетевой безопасности не применяется?
Комментарии:
1. Здесь недостаточно информации, чтобы дать обоснованный ответ. У вас есть пример кода того, как вы создаете клиента. К каким серверам вы подключаетесь
2. К сожалению, пример кода был бы огромным. Какую конкретную часть вы хотите, чтобы я добавил?
3. Сервер, к которому я подключаюсь, — это серверы с сертификатами сервера, подписанными центром сертификации, которые я включил в библиотеку. Это означает, что этим CAs не доверяет сам телефон. Поэтому я ожидал бы, что сетевая политика не позволит мне подключиться к ним, даже если я явно добавлю их в хранилище ключей trust manager в своем коде.
4. Как насчет того, чтобы создать пример приложения в github, который продемонстрирует проблему?
5. Это запатентованный продукт, и я не хочу раскрывать серверы и сертификаты по юридическим соображениям и соображениям безопасности. Я с удовольствием поделюсь фрагментами кода по запросу. Но я не могу поделиться всей кодовой базой