Android P 无法使用 TLS:network-security-config: cleartextTrafficPermitted 不支持 IP(仅限域名)

13

我正在尝试连接一个嵌入式设备的HTTP服务器,该服务器在Android < P上运行良好(直到我设置targetSdkVersion 28),因为有一个改变,即默认启用了网络TLS

有一种方法可以禁用明文传输,但似乎这只适用于域名而不是IP地址。


我尝试在清单中使用IP设置android:networkSecurityConfig,但这没有起作用:

<network-security-config>
  <domain-config cleartextTrafficPermitted="false">
    <domain includeSubdomains="true">172.16.33.1</domain>
  </domain-config>
</network-security-config>

将其设置为 <base-config cleartextTrafficPermitted="false"> 也无法使此项工作。


因此,似乎在没有域名的情况下无法使非TLS通信工作。但由于这是本地网络中的嵌入式设备,我们没有域名(我们只知道IP地址)。

这似乎是所有嵌入式设备的一个重大问题,它们将无法再进行通信。此外,“新应用程序和对现有应用程序的更新需要针对API级别[2020年11月的28级]”(从2018年11月开始使用API 26并每年推进一次)。

有什么想法可以实现这个?


3
如果您想启用非TLS通信,则需要将cleartextTrafficPermitted设置为true,而不是false - laalto
1
啊,太简单了,我的错。当然需要是“true”。对于IP地址,使用<base-config cleartextTrafficPermitted="true">就可以工作了。谢谢! - hardysim
你能允许所有URL的明文传输吗?还是必须指定每个URL? - Kris B
5个回答

25

对于IP地址,它使用<base-config cleartextTrafficPermitted="true">来运作。

(当然,它也需要是true而不是false)。


这个应该放在哪里?是放在 domain-config 里面还是只放在 network-security-config 里面? - Carlos.V
https://developer.android.com/training/articles/security-config#base-config - Carlos.V
你能允许所有的URL吗?还是必须指定每个URL? - Kris B
@KrisB 如果你还需要的话,请看我的回答。 - Langkiller
这个可以用,但我认为它更像是一种变通方法而不是解决方案。 <domain-config cleartextTrafficPermitted="true"> 应该能解决问题。如果不能,问题就出在别的地方了。 - Karol Kulbaka
能否指定一个IP范围而不是单个IP地址? - Alex8752

14

我知道这个问题已经得到了回答和接受,但是如果有人需要允许应用程序中的所有明文流量(对于所有URL),则可以添加以下行到应用程序标记:

<application
    ...
    android:usesCleartextTraffic="true">
    ....
</application>
如果您的minSdkVersion低于23,也就是此属性被引入的版本之前,Android Studio会告诉您:

Attribute usesCleartextTraffic is only used in API level 23 and higher (current min is ...)

然而,根据我的经验,在SDK低于23的情况下,“android:usesCleartextTraffic”属性将被简单地忽略。如果存在 Android Network Security Config,则在 Android 7.0(API级别24)及以上版本中,此标志将被忽略 (链接)

3

对我来说,仅仅这个答案并没有起作用。我还需要在清单文件中注册此配置项,而对于混合开发者来说,这是未知的。以下是我的修正方法。

网络安全配置

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">172.16.33.1</domain> <!-- Debug port -->
    <domain includeSubdomains="true">abc.com</domain>
  </domain-config>
</network-security-config>

AndroidManifest.xml

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

1
当然,您需要在清单文件中引用您的 network_security_config。当我提出这个问题时,这一点对我来说是很清楚的,并且也在我发布的文档的开头提到了(https://developer.android.com/training/articles/security-config)。 - hardysim

2
@hardysim的回答是有效的,这里给出一个快速示例。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true"></base-config>
</network-security-config>

0

您可以配置域名和基础路径:

    <?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:tools="http://schemas.android.com/tools">
    <base-config
        cleartextTrafficPermitted="true"
        tools:ignore="InsecureBaseConfiguration" />
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">localhost</domain>
        <domain includeSubdomains="true">10.0.2.2</domain>
        <domain includeSubdomains="true">127.0.0.1</domain>
    </domain-config>
</network-security-config>

并在清单文件中:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接