android 8:不允许明文http通信

wztqucjr  于 2021-06-29  发布在  Java
关注(0)|答案(18)|浏览(497)

我收到android8用户的报告说,我的应用程序(使用后端feed)没有显示内容。经过调查,我发现android 8出现了以下异常:

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和其他可能的标识符)
在android7和更低版本上,一切正常,我不设置 android:usesCleartextTraffic 在manifest中(并将其设置为 true 没有帮助,这是默认值),我也不使用网络安全信息。如果我打电话 NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted() ,它返回 false 对于android 8, true 对于旧版本,使用相同的apk文件。我试着在google上找到一些关于androido的信息,但是没有成功。

1dkrff03

1dkrff031#

正在添加。。。android:usescleartexttraffic=“真的”。。。你的清单文件可能会出现修复问题,但它打开了对数据完整性的威胁。
出于安全原因,我将清单占位符用于android:usescleartexttraffic inside 清单文件(如接受答案的选项3,即@hrishikesh kadam的响应)只允许在调试环境中使用明文。
在build.gradle(:app)文件中,我添加了一个清单占位符,如下所示:

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            manifestPlaceholders.cleartextTrafficPermitted ="true"
        }
    }

注意上面这一行的占位符名cleartexttrafficallowed

manifestPlaceholders.cleartextTrafficPermitted ="true"

然后在我的android清单中,我使用了相同的占位符。。。
androidmanifest.xml-

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="${cleartextTrafficPermitted}"
        ...>
        ...
    </application>
</manifest>

这样,只有在调试环境下才允许明文通信。

wvt8vs2t

wvt8vs2t2#

简单易行的解决方案
对于android
转到 Android Project ,然后单击 Properties ,

打开 AssemblyInfo.cs 把这个代码贴在那里: [assembly: Application(UsesCleartextTraffic =true)]
对于ios
使用 NSAppTransportSecurity :

你必须设置 NSAllowsArbitraryLoads 关键 YES 低于 NSAppTransportSecurity 你的字典 info.plist 文件。

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

gwo2fgha

gwo2fgha3#

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

在上面提供的建议中,我提供了我的url作为http://xyz..com/mno/
我把它改成xyz..com然后它就开始工作了。

xfb7svmp

xfb7svmp4#

更新日期:2019年12月-4.7.1

<manifest xmlns:tools=“http://schemas.android.com/tools”>

<application android:usesCleartextTraffic=“true” tools:targetApi=“28”>

请在android manifest.xml文件中添加以上内容
以前版本的爱奥尼亚
确保你的电脑里有以下内容 config.xml 在爱奥尼亚项目中:

<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application" xmlns:android="http://schemas.android.com/apk/res/android">
            <application android:networkSecurityConfig="@xml/network_security_config" />
            <application android:usesCleartextTraffic="true" />
        </edit-config>

运行ionic cordova build android。它在平台下创建android文件夹
打开androidstudio,打开android项目平台中的android文件夹。让它静置几分钟,这样它就能形成梯度
之后 gradle build 完成后,我们得到一些错误,包括 minSdVersionmanifest.xml . 现在我们要做的就是移除 <uses-sdk android:minSdkVersion="19" />manifest.xml .
确保将其从两个位置移除:
应用程序→ 舱单→ AndroidManifest.xml .
科多瓦利布→ 舱单→ AndroidManifest.xml .
现在再次尝试构建gradle,现在它成功构建了
确保应用程序中的应用程序标签中有以下内容→ 显示→ Androidmanifest.xml :

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

打开 network_security_config (应用→ 对象→ xml格式→ network_security_config.xml ).
添加以下代码:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">xxx.yyyy.com</domain>
    </domain-config>
</network-security-config>

在这里 .yyyy.com 是http api的链接。确保在url之前不包含任何http。
注意:现在使用androidstudio(build--build bundle's/apk--build apk)构建应用程序,现在您可以使用该应用程序,它在android pie中运行良好。如果你试着用爱奥尼亚cordova构建android来构建应用程序,它会覆盖所有这些设置,所以确保你使用android studio来构建项目。
如果您安装了任何旧版本的应用程序,请卸载它们并进行尝试,否则您将留下一些错误:
应用程序未安装

jdgnovmf

jdgnovmf5#

创建文件-res/xml/network\u security.xml
在network\u security.xml中->

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

打开androidmanifests.xml:

android:usesCleartextTraffic="true" //Add this line in your manifests

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme">
7ajki6be

7ajki6be6#

我已经从已经存在的android清单文件中删除了这一行

android:networkSecurityConfig="@xml/network_security_config"

并补充道

android:usesCleartextTraffic="true"

此应用程序标记位于清单中

<application
    android:usesCleartextTraffic="true"
    android:allowBackup="true"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    >

然后这个错误明文http流量覆盖。openstreetmap.nl不允许的是我在android 9和10。我希望这将适用于android 8也如果它是帮助你不要忘记投票谢谢

j91ykkif

j91ykkif7#

您可能只希望在调试时允许明文,但保留在生产中拒绝明文的安全好处。这对我很有用,因为我在不支持https的开发服务器上测试我的应用程序。以下是如何在生产中强制使用https,但允许在调试模式下使用明文:
内部版本.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}"
yx2lnoni

yx2lnoni8#

在androidmanifest中,我找到了以下参数:

android:networkSecurityConfig="@xml/network_security_config"

@xml/network\u security\u config在network\u security\u 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>

只是我把cleartexttrafficallowed改成了true

carvr3hs

carvr3hs9#

根据网络安全配置-
从android9(api级别28)开始,默认情况下禁用cleartext支持。
也看看-https://koz.io/android-m-and-the-war-on-cleartext-traffic/
代码实验室解释-https://codelabs.developers.google.com/codelabs/android-network-security-config/index.html
方案1-
首先尝试用“https://”而不是“http://”点击url
方案2-
创建文件res/xml/network\u security\u config.xml-

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">api.example.com(to be adjusted)</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>

方案3-
android:usescleartexttraffic doc
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 也可能是个问题-
根据舱单文件- android:targetSandboxVersion 此应用程序要使用的目标沙盒。沙盒版本号越高,安全级别就越高。其默认值为1;也可以将其设置为2。将此属性设置为2会将应用程序切换到不同的selinux沙盒。以下限制适用于级别2沙盒:
的默认值 usesCleartextTraffic 在网络安全配置中为false。
不允许uid共享。
所以选择4-
如果你有 android:targetSandboxVersion<manifest> 然后把它减少到 1 androidmanifest.xml-

<?xml version="1.0" encoding="utf-8"?>
<manifest android:targetSandboxVersion="1">
    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>
g6baxovj

g6baxovj10#

好的,就是这样⇒⇒ 不是⇐⇐ 成千上万次的重复会将其添加到您的清单中,但是一个基于此的提示会给您带来额外的好处(也许还有一些背景信息)。
android有一种覆盖src目录的功能。
默认情况下,您有
/应用程序/src/main
但是您可以添加其他目录来覆盖androidmanifest.xml。其工作原理如下:
创建目录/app/src/debug
在内部创建androidmanifest.xml
在这个文件中,您不必把所有规则都放在里面,只需要从/app/src/main/androidmanifest.xml中覆盖那些规则
下面是请求的明文权限的外观示例:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.yourappname">

    <application
            android:usesCleartextTraffic="true"
            android:name=".MainApplication"
            android:label="@string/app_name"
            android:icon="@mipmap/ic_launcher"
            android:allowBackup="false"
            android:theme="@style/AppTheme">
    </application>

</manifest>

有了这些知识,您现在可以轻松地根据调试主发布环境重载权限。
最大的好处是。。。您的产品清单中没有调试内容,并且您保持了一个直接且易于维护的结构

nbysray5

nbysray511#

它可能对某人有用。
我们最近在android9上也遇到了同样的问题,但是我们只需要在webview中显示一些url,没有什么特别的。所以添加 android:usesCleartextTraffic="true" 清单的工作,但我们不想损害整个应用程序的安全性。所以解决方法是从 httphttps

5hcedyr0

5hcedyr012#

在开发应用程序时,我也遇到了同样的“不允许明文http通信”错误。我在我的应用程序中使用Reformat2进行网络调用,我有两个项目环境(开发和生产)。我的生产域有带有https调用的ssl证书,而dev没有https。在构建风格中添加了配置。但当我换成dev时,这个问题就会触发。所以我添加了下面的解决方案。
我在清单中添加了明文通信

android:usesCleartextTraffic="true"

然后我在改造配置类okhttp creation time中添加了一个连接规范。

.connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))

下面给出了完整的okhttpclient创建

OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .readTimeout(10, TimeUnit.SECONDS)
        .connectTimeout(10, TimeUnit.SECONDS)
        .cache(null)
        .connectionSpecs(CollectionsKt.listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
        .addInterceptor(new NetworkInterceptor(context))
        .addInterceptor(createLoggingInterceptor())
        .addInterceptor(createSessionExpiryInterceptor())
        .addInterceptor(createContextHeaderInterceptor())
        .build();
oxosxuxt

oxosxuxt13#

好吧,我已经弄明白了。这是由于manifest参数 android:targetSandboxVersion="2" ,我补充说,因为我们也有即时应用程序版本-它应该确保比一旦用户从即时应用程序升级到常规应用程序,他不会失去他的数据传输。然而,正如模糊的描述所暗示的:
指定此应用程序要使用的目标沙盒。更高的sanbox版本将具有更高的安全级别。
此属性的默认值为1。
显然,它还增加了新的安全策略级别,至少在android8上是这样。

aij0ehis

aij0ehis14#

更改您的url HTTPHTTPS ;
成功了!!!

6tdlim6h

6tdlim6h15#

我在android9中遇到的问题是使用http在域上的webview上导航,这个答案给出了解决方案

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

以及:
res/xml/network\u security\u config.xml文件

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

相关问题