Установка имени домена network_security_config.xml на localhost во время выполнения

Начиная с Android 9, Android по умолчанию разрешает сетевые подключения только через HTTPS. Однако единственные запросы, которые я делаю, выполняются через локальный хост (например,http://10.41.199.226:port/FooBar), который обрабатывается (C#)HttpListener прослушивание комбинации адресов: портов.

Поскольку этот запрос выполняется через HTTP, Android по умолчанию не разрешает его. Следуя этой документации Android оnetwork_security_config файл, я могу разрешить HTTP-соединения, добавив следующие network_security_config.xml файл

<?xml version="1.0" encoding="utf-8"?>
 <network-security-config>
   <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>

Это вызывается из манифеста Android с использованием android:networkSecurityConfig="@xml/network_security_config".

Это позволяет выполнить HTTP-запрос, однако, поскольку он устанавливает базовую конфигурацию, он позволяет выполнять HTTP-запросы во всем приложении. Это не очень хорошая идея, потому что я, возможно, захочу добавить исходящие запросы в будущем, которые я хотел бы использовать через HTTPS, и хотел бы, чтобы для этого была создана система безопасности. Сделать это запретным.

Далее в том же документе они вводят domain-config что позволяет вам установить cleartextTrafficPermitted в зависимости от домена, который я пробовал со следующими заданными доменами

<?xml version="1.0" encoding="utf-8"?>
 <network-security-config>
    <domain-config cleartextTrafficPermitted="true">
      <domain includeSubdomains="true">127.0.0.1</domain>
      <domain includeSubdomains="true">10.0.0.1</domain>
      <domain includeSubdomains="true">localhost</domain>
    </domain-config>
</network-security-config>

Без результатов, запросы по-прежнему блокировались из-за отсутствия https.

Я нашел локальный адрес устройства и добавил его в список доменов.

<domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">10.41.199.226</domain> <!--assume this is my local ip -->
</domain-config>

Это сработало, и HTTP был разрешен только при запросе через локальный хост, в то время как любой исходящий запрос потребовал бы HTTPS.

Единственная проблема заключается в том, что у меня нет возможности узнать локальный IP-адрес устройства, на котором будет запущено приложение, до его запуска.

Итак, мой вопрос: есть ли способ:

  1. Установить для доменного имени то, что будет автоматически регистрироваться как локальный IP-адрес? (что-то типаlocalhost как я пытался, но не получилось)
  2. Добавьте IP-адрес "подстановочного знака", который будет принимать любой IP-адрес в диапазоне 10.xxx (я надеялся, что настройка includeSubdomains="true" сделал бы это для меня при добавлении 10.0.0.0адрес. Но это не так)
  3. В качестве последнего средства можно ли отредактировать network_security_config.xml файла во время выполнения, поэтому я могу динамически обновить доменное имя одной из записей домена до текущего локального IP-адреса при запуске приложения?

Приложение разработано с использованием Unity 2019.1.8 с использованием среды выполнения сценариев IL2CPP.net 4.x

3 ответа

Самый простой способ реализовать это - использовать этот атрибут в вашем AndroidManifest.xml, где вы разрешаете весь http для всех запросов:

android:usesCleartextTraffic="true"

Но если вы хотите, например, еще несколько конфигураций для разных ссылок, разрешая http для некоторых доменов, но не для других доменов, вы должны предоставить networkSecurityConfig файл.

Для этого в Android 9 Pie вам нужно будет установить networkSecurityConfig в вашем манифесте application тег вроде этого:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config">




    </application>
</manifest>

Затем в вашей xml-папке вам нужно создать файл с именем network_security_config точно так же, как вы назвали его в манифесте, и оттуда содержимое вашего файла должно быть таким, чтобы разрешить все запросы без шифрования:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

Оттуда вам хорошо идти. Теперь ваше приложение будет запрашивать все типы подключений. Для получения дополнительной информации по этой теме https://developer.android.com/training/articles/security-config.

Попробуйте 1.0.2.2 вместо localhost. Меня устраивает. Источник

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">10.0.2.2</domain>
    </domain-config>
</network-security-config>

попробуй это

           //in AndroidManifest.xml
    <application
    android:networkSecurityConfig="@xml/network_security_config">
    .
    </application>



<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <certificates src="system" />
    </trust-anchors>
</base-config>
</network-security-config>
Другие вопросы по тегам