Android 项目网络安全配置知识记录

前言

Android 在 Android 9(Pie)[android:targetSdkVersion = 28]之后将网络通信默认配置为禁止了明文传输。所谓明文传输就是Http请求,所以如果我们开发版本高于 28 ,打包之后我们 app 中的 Http 请求都无法成功,将会抛出

W/System.err: java.net.UnknownServiceException: CLEARTEXT communication to **** not permitted by network security policy

的错误。

关于 Http 请求的限制历史:

  • 当 Android 6.0(Marshmallow)「(API 23)」发布时,谷歌提出了清单文件中配置: android:usesCleartextTraffic 作为防止意外使用明文通信的手段
<!-- 默认允许所有明文通信 -->
<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <!-- 信任系统预装 CA 证书 -->
        <certificates src="system" />
        <!-- 信任用户添加的 CA 证书,Charles 和 Fiddler 抓包工具安装的证书属于此类 -->
        <certificates src="user" />
    </trust-anchors>
</base-config>

  • Android 7.0 (Nougat) 通过引入Android网络安全配置 「Network Security Configuration」特性来过渡开发者配置这个属性。Android 7.0 ~ 8.0 「(API 24) 至 (API 27)」 之间,客户端仍可以使用 Http 请求。系统默认网络安全配置如下
<!-- 默认允许所有明文通信 -->
<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <!-- 信任系统预装 CA 证书 -->
        <certificates src="system" />
    </trust-anchors>
</base-config>

  • Android 9(Pie)「(API 28)」以后系统默认强制禁止明文传输 usesCleartextTraffic = true 且默认只信任系统级别证书,也就是我们在手机,设置-> 加密与凭据 ->信任的凭据 -> 系统tab下的所有证书。
<!-- 默认禁止所有明文通信 -->
<base-config cleartextTrafficPermitted="false">
    <trust-anchors>
        <!-- 信任系统预装 CA 证书 -->
        <certificates src="system" />
    </trust-anchors>
</base-config>

网络安全配置对我们开发者的影响

如果我们采用默认配置,在我们升级 targetSdkVersion >= 24 后,我们就会遇到 Https 请求无法通过抓包工具配置的证书进行抓包的问题。

当我们升级 targetSdkVersion >= 28 就会出现无法所有的 Http 请求都无法响应的问题。

通过上一节网络配置版本变化的描述过程我们会发现,原因在于,24 以上不再信任用户证书了所以抓不了包了,28 以上无法进行http请求的原因是,系统默认不让进行明文传输了。

什么是网络安全配置?

上面解释了这么配置就可以解决我们遇到的无法抓包和无法进行http请求的问题,我们大概可以理解为这个「网络安全配置」其实就是驾驭在代码之外的一个配置文件,程序读取配置来决定要不要校验http请求,是不是信任用户证书。

可以看出 google 虽然做了限制,但是也给了开发者自由。接下来就要凭着开发者的良心办事情了。

“最佳”实践

当然为了响应 Google 爸爸的要求和用户信息安全考虑,我们应该尽快升级所有的服务器域名为 Https 请求。但是对于有时候我们还是有一些域名为 Http 请求无法及时替换,就需要单独配置了。而且就正式的 APP 包,我们并不希望可以让其他人抓包,来给我们服务器带来安全隐患。

允许明文传输

  • 方法一

允许明文传输有两种配置方法第一个是在项目的主 module 的 AndroidManifest.xml 的 application 节点下配置

<application
        ...
        <!--允许 -->
        android:usesCleartextTraffic="true"
        ...>
        ...
</application>

但是这个属性在 Android 7.0 以后会被 android:networkSecurityConfig 属性覆盖。

  • 方法二

添加在主工程中配置 res/xml/network_security_config.xml 如果没有可以新建一个文件。该配置会覆盖系统默认配置。所以我们可在这里配置我们自己的想要的网络配置。配置完成后我们需要在 AndroidManifest.xml 的 application 节点下配置

<application
        ...
            <application android:networkSecurityConfig="@xml/network_security_config"
            <!--7.0后会被覆盖-->
        <!--android:usesCleartextTraffic="true"--> 
        ...>
        ...
</application>

  • 如何配置 network_security_config

可包含:

0 或 1 个 <base-config>基本配置,也就是默认配置。 任意数量的 <domain-config> 可以规定任意域名的请求配置 0 或 1 个 <debug-overrides> debug 模式下域名的配置,可用于调试下进行一些独立配置。

如果我们需要只需要支持某些域名下的明文传输,就可以利用 domain-config 来进行单独配置

<network-security-config>
    <!--允许有多个 domain-confing 该domain-config 下的domain 域名允许明文传输-->
    <domain-config cleartextTrafficPermitted="true">
        <!--includeSubdomains 是否是包含子域名-->
        <domain includeSubdomains="true">example.com</domain>
        <domain includeSubdomains="true">cdn.example2.com</domain>
    </domain-config>
    <!--除了domain-config 的标签下的域名都不允许明文传输-->
    <base-config cleartextTrafficPermitted="false" />
</network-security-config>

信任用户证书

比如我们需要允许debug模式下允许抓包,也就是信任 user 证书可以进行下面的配置

<network-security-config>
    <!-- 支持 Android 7.0 以上调试时,信任 Charles 等抓包工具的证书 -->
    <debug-overrides>
            <trust-anchors>
                <certificates src="system" />
                <certificates src="user" />
            </trust-anchors>
    </debug-overrides>
    ...
</network-security-config>

对于更多的配置信息大家可以参照google文档:网络完全配置 一节。

在解决网络完全配置的时候突然想到了 Https 证书验证的问题,为什么我们APP本地没有安装证书,使用 OkHttp 也不用忽略证书验证,同样访问大多数网站的时候我们也都没有下载证书。就可以访问了。其实是因为 OkHttp 对于通过CA机构颁发的服务器证书,是默认通过校验的。一些公司的自签名证书就不行了。比如 12306。

#参考

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码免费领取(如遇扫码问题,可以在评论区留言领取哦)~

请添加图片描述

网络安全面试题

绿盟护网行动

还有大家最喜欢的黑客技术

网络安全源码合集+工具包

所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码免费领取(如遇扫码问题,可以在评论区留言领取哦)~

请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值