Android不能进行http请求,https抓包后请求失效的解决

当把应用的targetSdkVersion设置成24或更大时,使用抓包工具(比如Charles)无法对https请求进行抓包(https请求显示红色叉叉),并且https请求发不出去,即使安装了Charles的证书。

当把应用的targetSdkVersion设置成28或更大时,应用的http请求发不出去,系统只允许发送https请求。发送http请求会报错:

Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted

当同时设置targetSdkVersion=28或以上,并且使用抓包工具抓包,那么你的应用就会变成无法联网状态(单机)。

从2019年8月开始,Googe Play要求我们应用的targetSdkVersion必须设置成28或以上,那么以上的问题我们都会遇到。

如果你的项目中使用到了apache的HttpClient组件,那么在targetSdkVersion=28或以上时,Googe Play要求需要在AndroidManifest的application标签中增加以下配置:
<uses-library android:name="org.apache.http.legacy" android:required="false" /> <!--跟Activity同级别-->

如何解决以上问题呢?

一、设置允许http请求

在AndroidManifest.xml文件中给application配置属性

android:usesCleartextTraffic="true"

示例

  <application
        android:name=".App"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme" >

加上这个属性后,就能发http请求了。

二、允许charles对https请求抓包

在AndroidManifest.xml文件中给application配置属性

android:networkSecurityConfig="@xml/network_security_config"

并且在res文件夹下创建xml文件夹,并添加network_security_config文件,文件内容如下:

<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="system" overridePins="true" />
            <certificates src="user" overridePins="true" />
        </trust-anchors>
    </base-config>
</network-security-config>

这个配置的作用是信任自签名ssl证书。这样你就能使用charles对https进行抓包了。

当你同时给application加上以上两个属性后,比如

 <application
        android:name=".App"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:usesCleartextTraffic="true"
        android:networkSecurityConfig="@xml/network_security_config"
        android:theme="@style/AppTheme" >

你会发现,http请求还是发不出去,但是https抓包是可以的。因为配置android:networkSecurityConfig="@xml/network_security_config"这个属性后,android:usesCleartextTraffic="true"这个配置就会失效。原因可能是个bug吧。

如何让这两个配置都生效呢?

先去掉AndroidManifest.xml中android:usesCleartextTraffic="true"属性,然后在network_security_config文件中base-config标签加上属性cleartextTrafficPermitted="true"即可。

因此,要解决这两个问题,只需要给AndroidManifest.xml中的application标签配置属性
android:networkSecurityConfig="@xml/network_security_config"

示例:

 <application
      android:name=".App"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:networkSecurityConfig="@xml/network_security_config"
      android:theme="@style/AppTheme" >

network_security_config文件完整内容如下:

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" overridePins="true" />
            <certificates src="user" overridePins="true" />
        </trust-anchors>
    </base-config>
</network-security-config>
原创文章 56 获赞 44 访问量 9万+

猜你喜欢

转载自blog.csdn.net/devnn/article/details/100106813
今日推荐