在Android开发中,为了帮助测试人员进行抓包,一般都会在Android的AndroidManifest.xml文件中配置network_security_config。不过,这也带来了一些安全性的问题,所以我们通常的策略是:线上的版本不支持抓包,测试版本支持抓包即可。为此,我们需要单独为正式服和测试服单独的进行配置。

通常,network_security_config.xml 文件配置如下:

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

然后,在AndroidManifest.xml里的<application>标签中添加代码。

android:networkSecurityConfig="@xml/network_security_config"

为了实现在测试、开发阶段可以抓包,但正式发布包不能抓包,我们需要做如下的配置。首先,我们在AndroidManifest.xml里的<application>标签中新增的代码改成 。

android:networkSecurityConfig="${NETWORK_SECURITY_CONFIG}"

然后,我们在buildTypes中的release和debug脚本配置中分别配置如下脚本:

release {
       manifestPlaceholders = [
           NETWORK_SECURITY_CONFIG: ""
       ]
} 

debug {
       manifestPlaceholders = [
           NETWORK_SECURITY_CONFIG: "@xml/network_security_config"
       ]
}

由上面的配置可以看到,由于压根就没有引入证书文件,所以Release模式下打的包不能抓包,反之Debug包则可以。所以我们要做的就是开发测试阶段打Debug包、发布线上就打Release包即可。

同时,对于Android7.0以上的手机,开着网络代理访问不了Webview页面的问题,我们需要在Webview的WebViewClient中将下面这行代码给注释掉。

super.onReceivedSslError(view, handler, error);

这一段代码的作用是为了忽略掉SSL证书错误,因为开启代理后网络会变得不安全,证书会错误,Webview检测到证书错误之后就直接让Webview白板,不请求任何数据。

更多推荐