Объедините конфигурацию сетевой безопасности с OkHttp и пользовательскими CAs

#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. Это запатентованный продукт, и я не хочу раскрывать серверы и сертификаты по юридическим соображениям и соображениям безопасности. Я с удовольствием поделюсь фрагментами кода по запросу. Но я не могу поделиться всей кодовой базой