一、背景
客户端在开发过程中,经常遇到以下问题:
- 服务经常挂掉
- 制造数据的过程繁琐
- 正在发布,需慢慢等
- 服务端正忙,事情优先级靠后
- 服务端修改数据,会影响测试过程
- 只定义好了接口,客户端进度被Block
二、收益
客户端在开发过程中,Mock数据的意义:
- 团队并行工作
前后端人员定义好接口文档,就可以开始并行工作,互不影响。有利于整个产品质量以及进度的保证。
- 隔离系统
构造的虚拟请求响应,不会造成服务端接口真实数据的污染。
- 快速排查和定位问题
- 降低沟通和时间成本
三、方案
1. 第三方系统
SDK + 管理后台
- 被相关政策限制
- 只支持Android系统
参考玩安卓APP
2. APP网络框架拦截
OkHttp / ...
不足:
- 每次修改后,都需要编译
- 书写Json String容易出错
3. 抓包工具重定向
Charles / Fiddler
原理:中间人攻击
Android 对 HTTPS 的限制,通常来自 2 个方面:Android 系统自身的限制 和 开发者加强了 CA 验证。
Android 高版本系统(Android 7.0+)将不信任用户自行安装的 CA 证书,导致验证不通过。
针对这种情况,有如下几种解决方案:
- 可打包 Apk:配置 networkSecurityConfig,针对此 App 信任用户证书;
- 可打包 Apk:调低 targetSdkVersion 至 24 以下;
- 不可打包 Apk:采用「平行空间(v4.0.8625 以下)」版本的 App 运行后抓包;
- 不可打包 Apk:系统 Root 后,将 CA 证书装入系统目录;
- 换个 Android 7.0 以下的设备抓包;
针对可自行打包的 Apk,通常会设置内部测试版本和对外发布版本,以不同的打包策略来做隔离。
除了 Android 系统自身的约束外,开发者还会加强 App 的 CA 验证,通常的技术手段有「公钥证书固定」和「双向认证」。
针对公钥证书固定,解决方案有:
- 利用 Xposed 的 JustTrustMe 插件破解,Hook 相关流程将固定证书移除;
- 利用 VirtualApp 加入 Hook 代码,原理与 JustTrustMe 类似;
- 导入真正的公钥证书和密钥(仅适用于内部使用);
再就是双向认证,广义上的 HTTPS,通常只做了客户端验证服务端,实际上 HTTPS 是可以做到双向验证的,针对双向验证的 App,可使用 HttpCanary 导入证书,并通过逆向的手段拿到私钥进行破解抓包。
为什么使用Charles / Fiddler,而不使用Wireshark工具?
- Wireshark可运行在Windows和Mac OS上,但使用者需要了解网络协议
- 为了安全考虑,Wireshark只能查看封包,而不能修改封包的内容,或者发送封包
- Charles/Fiddler专门用来捕获HTTP、HTTPS。而Wireshark虽然能获取HTTP、HTTPS,但是不能解密HTTPS,所以Wireshark更适合其他协议,比如:TCP、UDP
Wireshark与对应的OSI七层模型:
Chalers界面友好、跨平台、易破解:
1. Map Local
将指定的网络请求重定向到Local文件,但是会局限于文本类型的接口
2. Map Remote
将指定的网络请求重定向到另一个URL,一般搭配下一节介绍的Mock服务使用
4. 搭建Mock服务
PC + Mobile + 网络分析工具 + 服务器
- Charles分析工具
Map Remote
- 模拟数据服务器
mocky.io / 内网搭建Mock服务
伪造Url和数据
配置Map Remote到Url
再次请求接口,返回Remote的数据
内网搭建Mock服务的优点:
- mocky.io将来可能关停
- 多端共享修改后的Response内容
- 某些公司有网络限制,例如:杀毒防火墙
IP:端口 =》 域名
5. 网络框架拦截 + APP工具
可视化编辑、跨进程Mock API
参考:
Android 高版本 HTTPS 抓包解决方案及问题分析!
天天给 App 抓包,还不懂 HTTP 代理吗? | 实用 HTTP