Установка доменного имени network_security_config. xml для localhost во время выполнения - PullRequest
0 голосов
/ 10 января 2020

Поскольку 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 и хотел бы, чтобы для этого была установлена ​​безопасность net. Делая это нет- go.

Далее в том же документе они вводят 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 off устройство, которое будет запускать приложение до его запуска.

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

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

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

1 Ответ

1 голос
/ 20 января 2020

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

android:usesCleartextTraffic="true"

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

Чтобы сделать это в Android 9 P ie, вам нужно будет установить 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>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...