没有 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>
将此设置为<base-config cleartextTrafficPermitted="false">
也不起作用。
因此,似乎没有办法让非 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
。然后它与<base-config cleartextTrafficPermitted="true">
一起工作以获取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】:它正在使用<base-config cleartextTrafficPermitted="true">
获取 IP 地址。
(当然也需要true
而不是false
)。
【讨论】:
这个去哪儿了?在domain-config
里面还是在network-security-config
里面?
developer.android.com/training/articles/…
您可以允许所有 URL 还是必须指定每个 URL?
@KrisB 如果您仍然需要,请查看我的回答以上是关于没有 TLS 的 Android P:network-security-config: cleartextTrafficPermitted IP 不可能(仅域)的主要内容,如果未能解决你的问题,请参考以下文章
android黑科技系列——Wireshark和Fiddler分析Android中的TLS协议包数据(附带案例样本)
Wireshark和Fiddler分析Android中的TLS协议包数据(附带案例样本)
java.net.UnknownServiceException: CLEARTEXT communication to www.httpbin.org not permitted by networ