没有 TLS 的 Android P:network-security-config: cleartextTrafficPermitted IP 不可能(仅域)

Posted

技术标签:

【中文标题】没有 TLS 的 Android P:network-security-config: cleartextTrafficPermitted IP 不可能(仅域)【英文标题】:Android P without TLS: network-security-config: cleartextTrafficPermitted not possible for IP (only domain) 【发布时间】:2018-11-30 09:56:31 【问题描述】:

我正在尝试使用在 android targetSdkVersion 28),因为 Network TLS enabled by default 发生了变化。

有一种方法可以Opt out of cleartext traffic,但似乎仅适用于域,而不能用于 IP 地址


我尝试在 Manifest 中使用 IP 而不是域设置 android:networkSecurityConfig,但这不起作用:

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

将此设置为&lt;base-config cleartextTrafficPermitted="false"&gt; 也不起作用。


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

对于所有无法再通信的嵌入式设备来说,这似乎是一个主要问题。另外,"new apps and updates to existing apps require to target API level [28 in November 2020]"(从 2018 年 11 月开始使用 API 26,并且每年都在推进)。

任何想法如何使这成为可能?

【问题讨论】:

如果要启用非 TLS 通信,则需要将 cleartextTrafficPermitted 设为 true,而不是 false Arg,没办法 - 太容易了。我的错。当然必须是true。然后它与&lt;base-config cleartextTrafficPermitted="true"&gt; 一起工作以获取IP 地址。谢了! 您可以为所有 URL 使用明文还是必须指定每个 URL? 【参考方案1】:

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

<application
    ...
    android:usesCleartextTraffic="true">
    ....
</application>

如果你的 minSdkVersion 低于 23,在这个属性被引入的地方,Android Studio 会告诉你:

属性 usesCleartextTraffic 仅用于 API 级别 23 及更高级别 (当前最小值为 ...)

但是,据我的经验,“android:usesCleartextTraffic”属性将在 SDK 低于 23 时被忽略。

如果存在 Android 网络安全配置,则在 Android 7.0(API 级别 24)及更高版本上会忽略此标志 (link)

【讨论】:

【参考方案2】:

对我来说,仅此答案是行不通的。我也必须在清单文件中注册此配置,这对于混合开发人员来说是未知的。以下是我的修复。

network_security_config

<?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>

【讨论】:

当然你需要在清单中引用你的network_security_config。当我提出这个问题时,我很清楚这一点,并且在我在帖子 (developer.android.com/training/articles/security-config) 中链接的文档的开头也提到了这一点。【参考方案3】:

@hardysim 回答有效,这里是一个简单的例子

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

【讨论】:

【参考方案4】:

它正在使用&lt;base-config cleartextTrafficPermitted="true"&gt; 获取 IP 地址。

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

【讨论】:

这个去哪儿了?在domain-config 里面还是在network-security-config 里面? developer.android.com/training/articles/… 您可以允许所有 URL 还是必须指定每个 URL? @KrisB 如果您仍然需要,请查看我的回答

以上是关于没有 TLS 的 Android P:network-security-config: cleartextTrafficPermitted IP 不可能(仅域)的主要内容,如果未能解决你的问题,请参考以下文章

为 TLS 禁用除 secp256 之外的所有椭圆曲线?

android黑科技系列——Wireshark和Fiddler分析Android中的TLS协议包数据(附带案例样本)

Wireshark和Fiddler分析Android中的TLS协议包数据(附带案例样本)

java.net.UnknownServiceException: CLEARTEXT communication to www.httpbin.org not permitted by networ

如何在 Android Volley 中判断 TLS 版本

在 Android OS 4.4.2/MobileFirst 混合应用程序上启用 TLS 1.2