从Android Nougat(7.0)开始,谷歌改变了网络安全策略。自签的CA证书将默认不被HTTPS连接信任,这意味着HttpCanary将无法解析TLS/SSL数据包,即无法抓取HTTPS的明文数据。但是我们可以通过两种方式来绕过这种限制。
首先在AndroidManifest.xml中添加networkSecurityConfig:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>
network_security_config文件放在 res/xml/ 目录下面:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>
为了APP的信息安全,需要注意以上配置只能用于debug包,正式发布的包请移除这些配置。更多关于网络安全策略的信息,请前往Android Developer查看Network security configuration。
我们可以借助VirtualApp这款应用来抓第三方的HTTPS包。通过以下几个步骤来配置抓包环境。
打开HttpCanary应用,并进入设置->安装VirtualApp,然后点击安装。注意8.0及以上的手机会限制安装来源,请勾选同意。安装完成后,可以选择在系统设置页面中手动关闭安装来源开关。
打开VirtualApp安装抓包目标App,然后在VirtualApp中启动目标App,这样就可以在HttpCanary看到想抓的App请求包了,但是抓包记录显示的应用信息会是VirtualApp。
有些App会校验证书签名,如果和服务端不匹配的话,客户端和服务端会握手失败,拒绝连接。这种情况下,HttpCanary无论如何都是抓不到包的,且没有任何办法可以绕过去(除非我们能拿到服务端的证书,这个还是不要想了)。
HttpCanary提供了两种不同的注入模式,分别是静态注入和动态注入。在首页长按抓包记录,然后在弹框中选择一种注入模式。
静态注入支持对HTTP/HTTPS包全量的注入,包括请求参数、请求头、请求体、响应行、响应头、响应体等。另外,如果配置了静态注入,注入器将会缓存起来,以便后面重复使用。但是可以前往App的设置->模组管理种,对其进行禁用、启用、删除等操作。
相比于静态注入,动态注入不支持对请求体和响应体的注入,主要是由于手机端不方便处理太大数据类型的请求体和响应体。不过,我们正在考虑支持动态注入一些小数据类型的请求体和响应体。 如果使用动态注入,必须先将抓包服务运行起来,且必须记住注入不要花太长时间,防止请求或者响应超时。
HttpCanary提供了众多数据类型的预览,比如json格式等等。
下表是HttpCanary对一些数据类型的支持明细(持续更新中)。
数据类型 | 预览 |
---|---|
application/json | true |
application/octet-stream | false |
application/xml | false |
application/x-zip-compressed | false |
audio/aac | true |
audio/mpeg | true |
audio/mp3 | true |
audio/ogg | true |
audio/wav | true |
audio/x-aac | true |
audio/x-wav | true |
image/bmp | true |
image/gif | true |
image/jpeg | true |
image/png | true |
image/webp | false |
text/plain | some of |
video/mpeg | false |
video/mp4 | false |