Android P-当网络安全配置基本配置cleartextTrafficPermitted为true时,NetworkSecurityPolicy.isCleartextTrafficPermitted为false

时间:2018-08-23 16:15:22

标签: android http https android-9.0-pie

这是在使用支持库版本28.0.0-rc01的Android P上。

根据一些SO帖子,我已按照此问题的说明/解决方案进行操作:

How to solve Android P DownloadManager stopping with "Cleartext HTTP traffic to 127.0.0.1 not permitted"?

Android 8: Cleartext HTTP traffic not permitted

以及其他几个。

问题是,即使network-security-config base-config将此值设置为true,当我检查NetworkSecurityPolicy.isCleartextTrafficPermitted时,它也会返回false。在WebView中导航到非https页面时,这会导致ERR_CLEARTEXT_NOT_PERMITTED错误。

这是AndroidManifest的代码段

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

我已经尝试过结合使用“ usesCleartextTraffic”,“ networkSecurityConfig”和两者的组合。

这是相关的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>

请注意,我尝试过使用和不使用“信任锚”。我确实有一个AndroidManifest产品和network-security-config产品,以及一个调试版本。但是,两者的设置相同(除系统外,调试还允许用户证书)。

我还通过检查logcat验证了正在读取安全策略。此时,我似乎茫然无措,因为似乎无法兑现设置。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:5)

由于某些原因,即使设置几乎相同,调试AndroidManifest和network-security-config仍会引起问题-唯一的区别是调试版本还允许用户生成证书。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:networkSecurityConfig="@xml/network_security_config"
        tools:targetApi="n" />

</manifest>

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <base-config cleartextTrafficPermitted="true" >
           <trust-anchors>
               <!-- Trust user added CAs while debuggable only -->
               <certificates src="user" />
               <certificates src="system" />
           </trust-anchors>
        </base-config>
    </debug-overrides>
</network-security-config>

删除调试AndroidManifest.xml和network_security_config.xml文件可以解决此问题。我仍然不确定为什么会起作用,但是无论如何我们都不再需要调试清单了,所以现在就继续吧。

答案 1 :(得分:2)

我只有:

android:usesCleartextTraffic="true" 
清单中的

并删除了network_security_config.xml。似乎可行!