在运行时将network_security_config.xml的域名设置为localhost

问题描述 投票:0回答:1

自Android 9起,默认情况下,Android仅允许通过HTTPS进行网络连接。但是,我正在执行的唯一请求是通过本地主机(例如http://10.41.199.226:port/FooBar)完成的,该本地主机由(C#)HttpListener收听该地址:端口组合。

由于此请求是通过HTTP发出的,因此默认情况下,Android不允许。关于Android this documentation文件,Android跟随network_security_config,我可以通过添加以下network_security_config.xml文件来允许HTTP连接

<?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:networkSecurityConfig="@xml/network_security_config"从Android清单中调用。

这允许完成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.x.x.x范围内的任何IP(我希望设置includeSubdomains="true"会在添加10.0.0.0地址时为我完成此操作。但这不是)
  3. 作为最后的解决办法,是否可以在运行时编辑network_security_config.xml文件,因此在启动应用程序时,我可以将一个域名条目的域名动态更新为当前的本地ip?

[该应用是使用Unity 2019.1.8通过.net 4.x IL2CPP脚本运行时开发的

android http https android-manifest android-network-security-config
1个回答
0
投票

实现此目的的简单方法是对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

© www.soinside.com 2019 - 2024. All rights reserved.