google 文档在关于网络安全配置说明如下:所有使用TLS和HTTPS的协议会默认信任所有预安装的系统CA,也会信任target Android 6.0及以下版本用户级别添加的CA证书。但7.0及以上需要在代码中进一步设置才能够正常抓包,具体如下:
一、先配置一下Charles相关
下载Charles客户端:https://www.charlesproxy.com


另外需要注意的是,默认会把证书装在“登录”的下面,同样复制一份到“系统”下才能正常抓包,也是要始终信任。





手机和电脑连接同一个wifi,然后在手机连接的这个wifi打开高级设置,设置代理方式为手动,输入自己电脑的ip地址,端口号是刚刚设置的8888
另外需要手机要下载一个证书:

二、项目代码需要添加如下:
1、app模块的res文件下新增一个xml文件夹,里面包含一个networkapp_security的xml文件。

2、networkapp_security_config.xml内容如下:

debug—overrides表示只在debug编译type下开启证书设置,较为安全,不影响线上的发版,也是非常需要设置的,不然上线的时候加入忘记注释掉设置,容易有安全隐患。
3、以上是信任了所有user级别的证书,容易被恶意的中间人劫持,还有一种写法:信任具体的某个证书,可以保护应用程序免受任何其他CA颁发的欺诈性证书的侵害(例如只信任我自己电脑对应的证书,只有我自己可以抓包,其他人连接他自己电脑就无法抓包,安全级别相对更高一些,具体可以看下官网的详细介绍:https://developer.android.com/training/articles/security-config)
4、下面我们看下第二种信任指定证书的具体写法:
(1)res文件下再新增一个raw目录,并添加pem证书:

(2)pem证书的下载,保存到本地,粘贴进raw目录下

(3)修改networkapp_security_config.xml

三、测试效果
电脑和手机连接同一wifi,打开手机当前这个wifi的高级选项,设置代理方式为手动,设置ip地址为电脑的ip,端口号是刚刚设置的8888;开始测试,去请求https的接口,是否可以抓到数据包。
期间遇到的问题:最开始我用的是第二种方法,只信任指定的证书。试了一下,可以抓到包,然后以为能让所有qa和rd愉快的抓包了,但是qa同学安装之后,依然抓不到包,就开始找问题:
首先,我和qa用的是同一套代码打得包,我可以抓,他们不可以,怀疑charles配置的问题,电脑端证书、域名配置、能重新试的都试了,甚至charles重装成和我这边一样的版本,短短续续试了两周。。。因为也有正常的工作要做
昨天我看代码里配置的pem感觉有点问题,就试着换成第一种写法,直接信任所有user级别的ca证书,我这边依然可以抓包,非常激动的去qa同学那里试验,结果还是报错unknown(其实这时候已经真的开始怀疑人生了,眼前一黑,被情绪左右啊,其实忘记了重要的一个点,要抓包设备是要安装和这个qa的电脑对应的证书的,他们一般经常测试,每个测试机基本都有他们那个电脑对应的证书,恰巧这个qa同学他不怎么用Charles,用的其他工具,而换第一种写法之前每次去qa那里测,都会看下证书有没有装,这次就忘了简直天意弄人)。。。。。。啊西湖的水,我的泪,脑壳痛~~
最后结论就是:
1、就是如果单独自己抓包测试的话,就按照第二种写法,只对自己电脑生效,因为raw下的pem是自己电脑下载而来的(即使你直接在手机上按照步骤装了ca证书,其实也是忽略了,不会去读的,直接读raw下面这个了),其他人拿这个包就啥数据也抓不了。
2、给项目里所有qa和rd用,就按第一种写法,打一次包,大家都可以抓数据了
ELSE:如果targetsdkversion指向到28,即9.0。而且项目里用了http请求。会报ssl的错,需要在网络配置文件里打开clear的设置。参考链接:https://www.cnblogs.com/renhui/p/9921790.html

网友评论