干货|Android App无法抓包的解决方案总结
在Android手机安装上App应用后,使用抓包工具Fiddler/BurpSuite/Charles等无法抓包。
其中Android手机用户凭证已安装Fiddler/BurpSuite/Charles等的证书,此时考虑存在抓不到包的原因,可以分为以下四种情况:
(1).App应用只信任系统证书,不信任安装在用户凭证的证书。
(2).App应用做了单向校验,一般情况下是客户端校验服务端证书是否是正确来源的,也有服务端校验客户端证书的。
(3).App应用做了双向校验,也就是服务端和客户端互相校验证书来源的正确性。
(4).App应用不走http系统代理。
1.只信任系统证书的解决方案
使用抓包软件(Fiddler/BurpSuite/Charles)抓取App的https请求时,Android和(Fiddler/BurpSuite/Charles)都正确安装了证书却出现抓包失败,报错:
Client SSL handshake failed: An unknown issue occurred processing the certificate (certificate_unknown)
原因:
Android7.0之后默认不信任用户添加到系统的CA证书(基于SDK24及以上的App来说,即使在手机上安装了抓包工具的证书也无法抓取https请求)
Android7.0以后,安卓不信任用户安装的证书,所以抓https时无法解码请求,对于第三方应用,需要将证书添加为系统证书
只信任系统证书其实是在使用Android SDK的API 24(Android7.0)及以上的App应用系统中默认配置的,使用高于API 24(Android7.0)以上的SDK开发的App应用默认不信任安装的用户证书。
方法一
在Android手机Root的情况下,将证书以<Certificate_Hash>.<Number>的名称导入到/system/etc/security/cacerts/,一般后缀为0,需要使用到openssl进行计算导出证书的hash值
将导出的证书计算hash值
系统证书目录
/system/etc/security/cacerts/
每个证书的命名规则
<Certificate_Hash>.<Number>
openssl req -x509 -newkey rsa:1024 -keyout charles.key -out charles.crt -days 3650 -nodes
之后会让输入一下国家、地区、邮箱等,自己能记住就行。最后会生成2个文件:
charles.crt和charles.key
openssl pkcs12 -export -out charles.pfx -inkey charles.key -in charles.crt
.cer格式证书
openssl x509 -inform DER -subject_hash_old -in 证书文件.cer
openssl x509 -inform der -subject_hash_old -in BurpCA.cer
或
.pem格式证书
openssl x509 -inform PEM -subject_hash_old -in 证书文件.pem
openssl x509 -inform PEM -subject_hash -in BurpCA.pem | head -1
生成系统系统预设格式证书文件
cer格式
openssl x509 -inform DER -text -in xxx.cer > 0dd2455e.0
或
pem格式
openssl x509 -inform PEM -text -in xxx.pem > 0dd2455e.0
上传证书
上传证书文件0dd2455e.0到手机的如下路径
/system/etc/security/cacerts
使用adb连接
adb push 0dd2455e.0 /sdcard
adb shell
su
mount -o remount,rw /system
#mount -o rw,remount /system
cp /sdcard/0dd2455e.0 /system/etc/security/cacerts/
chmod 644 /system/etc/security/cacerts/0dd2455e.0
使用第三方文件管理器(推荐)
(1).下载酷安市场App->分别搜索Syslock和RE管理器并下载安装
(2).给Syslock和RE管理器root权限
(3).打开Syslock并解锁/system(每次重启后都得开启一次)
(4).将文件拷贝至手机中
(5).使用RE管理器将文件拷贝到如下路径
/system/etc/security/cacerts
(6).修改文件权限
然后重启手机,就可以正常抓https数据包;也可以到手机
设置->安全->信任凭据->系统查看
或
设置->安全->加密与凭据->信任的凭据
注意事项
这里需要强调的是,安装上系统证书,可到手机系统信任的凭证中查看是否已经有该证书显示信息,若存在就无需重启手机,因为对于高版本系统手机存在重启后证书失效的问题,在系统信任凭证中无法找到安装的证书,可到/system/etc/security/cacerts/目录下查看证书的大小是否为0kb,若为0即需要重新复制一份过来,如果多次尝试仍然为0,可考虑重启尝试。
http://codeblog.shape.dk/blog/2014/01/06/custom-ssl-certificate-with-charles-web-proxy/
方法二
网络安全性配置特性让应用可以在一个安全的声明性配置文件中自定义其网络安全设置,而无需修改应用代码。可以针对特定域和特定应用配置这些设置。此特性的主要功能,如下所示:
自定义信任锚
针对应用的安全连接自定义哪些证书颁发机构(CA)值得信任(例如:信任特定的自签署证书或限制应用信任的公共CA集)。
仅调试重写
在应用中以安全方式调试安全连接,而不会增加已安装用户的风险。
明文通信选择退出
防止应用意外使用明文通信。
证书固定
将应用的安全连接限制为特定的证书。
一般App应用都已采用360、腾讯、阿里、爱加密、梆梆、几维等加固厂商的加固加壳方案进行保护,无法反编译或反编译后无法进行二次打包签名,反编译、打包、签名、App运行等过程会报各种错误,因此以未加固App情况的解决方法
(1).限制可信CA集、为安全连接设置可信证书颁发机构
添加res/xml/network_security_config.xml
反编译无加固App后,在res/xml目录下找到network_security_config.xml,添加以下的配置代码,一般情况是存在network_security_config.xml文件,只需要添加
<certificates src="user" />
如果res/xml/network_security_config.xml文件不存在,则创建该文件
可试读38%