others - android 8:HTTP不允许明文通信

128 2

我收到了Android 8用户的报告,我的应用(使用后端Feed)没有显示内容。经过调查,我发现Android8发生以下异常:

 

08-29 12:03:11.246 11285-11285/E/: [12:03:11.245, main]: Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted


at com.android.okhttp.HttpHandler$CleartextURLFilter.checkURLPermitted(HttpHandler.java:115)


at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:458)


at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:127)


at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.doConnection(AbstractHttpAsyncTask.java:207)


at com.deiw.android.generic.tasks.AbstractHttpAsyncTask.extendedDoInBackground(AbstractHttpAsyncTask.java:102)


at com.deiw.android.generic.tasks.AbstractAsyncTask.doInBackground(AbstractAsyncTask.java:88)


at android.os.AsyncTask$2.call(AsyncTask.java:333)


at java.util.concurrent.FutureTask.run(FutureTask.java:266)


at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)


at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)


at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)


at java.lang.Thread.run(Thread.java:764)



(我已经删除了软件包名称,url和其他可能的标识符),

在Android 7及更低版本上一切正常,我没有在Manifest中设置android:usesCleartextTraffic(并将其设置为true无效,无论如何都是默认值),我也不使用网络安全信息。如果我调用NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted() ,对于Android 8,它返回false,对于旧版本,使用相同的apk文件返回true。

时间: 原作者:

56 3

根据网络安全配置-,

从Android9.0 (api级别28 )开始,默认情况下禁用明文支持。

还可以查看- https://koz.io/android-m-and-the-war-on-cleartext-traffic/

选项1-

创建文件res/xml/network_security_config.xml -,

 

<?xml version= "1.0" encoding= "utf-8" ?>


<network-security-config>


 <domain-config cleartextTrafficPermitted= "true"> 


 <domain includeSubdomains= "true"> Your URL(ex: 127.0.0.1)</domain>


 </domain-config>


</network-security-config>



AndroidManifest.xml -

 

<?xml version= "1.0" encoding= "utf-8" ?>


<manifest. ..>


 <uses-permission android:name= "android.permission.INTERNET" />


 <application


 . ..


 android:networkSecurityConfig= "@xml/network_security_config" 


 . ..>


 . ..


 </application>


</manifest>



选项2-

AndroidManifest.xml -

 

<?xml version= "1.0" encoding= "utf-8" ?>


<manifest. ..>


 <uses-permission android:name= "android.permission.INTERNET" />


 <application


 . ..


 android:usesCleartextTraffic= "true" 


 . ..>


 . ..


 </application>


</manifest>



同时 @david.s'回答指出android:targetSandboxVersion也可能是一个问题-,

根据 Manifest文档-,

android:targetSandboxVersion

此应用程序要使用的目标沙箱,沙箱版本号越高,安全性级别越高,它的默认值为1; 还可以将该属性设置为2.将此属性设置为2将该应用程序设置为其他SELinux沙箱,以下限制适用于级别2沙箱:

  • 网络安全配置中usesCleartextTraffic的默认值是false ,
  • 不允许使用Uid共享。

选项3-

如果在<manifest>中有android:targetSandboxVersion则将它缩减为1

AndroidManifest.xml -

 

<?xml version= "1.0" encoding= "utf-8" ?>


<manifest android:targetSandboxVersion= "1"> 


 <uses-permission android:name= "android.permission.INTERNET" />


 . ..


</manifest>



原作者:
96 2

在AndroidManifest中,我找到了此参数:

 

 android:networkSecurityConfig= "@xml/network_security_config" 



@xml/network_security_config在network_security_config.xml中定义为:

 

<?xml version= "1.0" encoding= "utf-8" ?>


<network-security-config>


 <!--Set application-wide security config using base-config tag.-->


 <base-config cleartextTrafficPermitted= "false" />


</network-security-config> 



只是我改变了cleartextTrafficPermitted

原作者:
82 2

你可能只希望在调试时允许明文,但是,要保持在生产中拒绝明文的安全,因为我在不支持https的开发服务器上测试我的应用程序,所以,对我很有用,在生产中强制执行https,但是,在调试模式下允许明文:

build.gradle 中的

 

//Put this in your buildtypes debug section:


manifestPlaceholders = [usesCleartextTraffic:" true" ]



//Put this in your buildtypes release section


manifestPlaceholders = [usesCleartextTraffic:" false" ]



AndroidManifest.xml中的应用程序标记中的

 

android:usesCleartextTraffic= "${usesCleartextTraffic}" 



原作者:
63 0

将你的urlHTTP更改为HTTPS

它工作了!

原作者:
84 3

它可能对某人有用。

我们最近对安卓9有同样的问题,但是,我们只需要在WebView中显示一些url,不太特别,所以添加 android:usesCleartextTraffic= "true" 我们不希望为这个整个应用程序破坏安全性。 所以,修复的目的是改变httphttps的链接

原作者:
102 2
 

<?xml version= "1.0" encoding= "utf-8" ?>


<network-security-config>


 <domain-config cleartextTrafficPermitted= "true"> 


 <domain includeSubdomains= "true"> ***Your URL(ex: 127.0.0.1)***</domain>


 </domain-config>


</network-security-config>



在上面提供的建议中我提供的网址为 http://xyz.abc.com/mno/

我把它改成xyz.abc.com,然后就开始工作了。

原作者:
95 2

好的我已经知道了,这是由于清单参数android:targetSandboxVersion= "2",因为我们也有即时应用版本,所以,应该确保用户从即时应用升级到普通应用,他的数据不会随着传输而且丢失,然而,模糊的描述表明:

指定此应用程序要使用的目标沙箱,更高的sanbox版本将增加安全级别。

此属性的默认值为1.

它显然也增加了新级别的安全策略,至少在Android 8上。

原作者:
107 1

升级到React Native 0.58.5或更高版本,他们的配置文件在RN0.58.5中有includeSubdomain

ChangeLog

在Rn0.58.5中,他们使用服务器域声明了network_security_config ,网络安全配置允许应用程序允许来自特定域的明文流量,所以不必通过声明额外的工作来 android:usesCleartextTraffic= "true" 在manifest文件的应用程序标记中,升级RN版本后将自动解决。

原作者:
118 2

要对Xamarin.Android应用这些不同的答案你可以使用类和程序集级别属性来手动编辑AndroidManifest.xml

当然需要(duh..)的互联网许可:

 

[assembly: UsesPermission(Android.Manifest.Permission.Internet)]



注:通常会将程序集级别属性添加到你的AssemblyInfo.cs文件中,但是,任何文件在using的下方和上方。

然后在应用程序子类(根据需要创建一个)上,可以使用对Resources/xml/ZZZZ.xml file:的引用添加NetworkSecurityConfig

 

#if DEBUG


[Application(AllowBackup = false, Debuggable = true, NetworkSecurityConfig = "@xml/network_security_config" )]


#else


[Application(AllowBackup = true, Debuggable = false, NetworkSecurityConfig = "@xml/network_security_config" ))]


#endif


public class App : Application


{


 public App(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer) { }


 public App() { }



 public override void OnCreate()


 {


 base.OnCreate();


 }


}



Resources/xml文件夹(如果需要,创建xml文件夹)中创建一个文件。

示例xml/network_security_config文件,根据需要调整(查看其他答案),

 

<?xml version= "1.0" encoding= "utf-8" ?>


<network-security-config>


 <domain-config cleartextTrafficPermitted= "true"> 


 <domain includeSubdomains= "true"> www.example.com</domain>


 <domain includeSubdomains= "true"> notsecure.com</domain>


 <domain includeSubdomains= "false"> xxx.xxx.xxx</domain>


 </domain-config>


</network-security-config>



你还可以在ApplicationAttribute上使用UsesCleartextTraffic参数:

 

#if DEBUG


[Application(AllowBackup = false, Debuggable = true, UsesCleartextTraffic = true)]


#else


[Application(AllowBackup = true, Debuggable = false, UsesCleartextTraffic = true))]


#endif



原作者:
...