① HTTPS 抓包原理以及 android 端如何防止抓包
抓包的基本原理就是中间人攻击 HTTPS 的握手过程 。Mac 上可使用 Charles 进行抓包。本质上就是两段 HTTPS 连接,Client <--> Man-In-The-Middle 和 Man-In-The-Middle <--> Server。使用 Charles 进行抓包,需要 Client 端提前将 Charles 的根证书添加在 Client 的信任列表中。
回顾之前的 HTTPS 的握手过程 ,可以知道 SSL 的核心过程就是客户端验证证书链合法性——客户端检查证书链中是否有一个证书或者公钥存在于客户端的可信任列表中。
手机系统中内置了上百份不同的根证书。Certificate Pinning 的原理其实就是 app 中内置需要被信任的特定证书,app 在验证服务器传过来的证书链时,使用这些特定证书来验证的。
证书的主要作用是公钥的载体,但在实践中我们更多是去 pinning 公钥, SubjectPublicKeyInfo(SPKI) 。这是因为很多服务器会去定期旋转证书,但是证书旋转后,证书中的公钥还是相同的公钥。
如果私钥泄露了,那么服务器端就不得不使用新的私钥做出新的证书。客户端为了预防这种情况,可以提前 pinning 这些新的证书。这样,当服务器替换新的证书时,客户端 app 就可以不做任何改动。
从 SDK 24 开始,Android 支持通过 xml 来配置 certificate pinning,见 Network Security Configuration 。
其中 <pin> 节点接受 SubjectPublicKeyInfo 的 hash 值。
OkHttp 从 2.1 开始直接支持 Certificate Pinning 。
我在项目实践中发现有的服务器并不会在 ssl 握手阶段 将完整的证书链传输过来——只会传证书链中的根证书和叶子证书。如果安卓系统中使用 HttpUrlConnection 访问服务器,抛出如下类似异常:
但是浏览器对于这种缺失中间证书的服务器却能验证通过,主要原因是浏览器访问有完整证书链的网站时,如果发现证书链中有浏览器没有内置的中间证书,那么浏览器会将该证书缓存下来,这样浏览器访问其他没有该中间证书的服务器时,就可以使用这个缓存的中间证书来验证证书链。
解决安卓上出现这个问题的方法是将这个中间证书通过 app 添加到信任证书列表中。我们需要将该中间证书加入到 App 运行时所用的 TrustManager 中。
使用 X509TrustManagerExtensions 可以将证书 pinning 到 app 中。 X509TrustManagerExtensions.checkServerTrusted() 允许开发者在系统对证书链验证通过后,再次使用自己的方法验证证书链。
使用方法如下:
② 网络抓包原理
本文以App作为例子,实际应用不限于App范围。
大部分场合都可以通过程序调试来定位问题,但有些场景使用抓包来定位接口问题更准确、更方便,如以下场景:
要实现对App的网络数据抓包,需要监控App与服务器交互之间的网络节点,监控其中任意一个网络节点(网卡),获取所有经过网卡中的数据,对这些数据按照网络协议进行解析,这就是抓包的基本原理。
但是中间网络节点,不受我们控制,所以基本无法实现抓包的,只能在客户端和服务端进行抓包。
通常我们监控本地网卡数据,如下图:
本地网络 指的是WIFI的路由,如果直接抓路由器的包还是比较麻烦的,因此我们会在 手机 和 本地路由 之间加一层 代理服务 ,这样只要抓代理服务的网络数据即可:
虽然在 手机 侧也可实现抓包,但和 本地路由 一样,抓包比较麻烦,如果不是没有办法,尽量还是不在手机侧抓包。但是有一种情况必须在手机端抓包,那就是在4G网络情况下:
4G网络状态下如何抓包,以及它的劣势,我们后面章节再细讲。
抓包实际上是分析网络协议的一种过程,尽管繁琐的细节劳动都让抓包工具做了,但我们还是需要了解下基础的网络协议,好帮助我们更好的分析问题。
首先需要了解下经典的OSI七层网络模型,以及每层的作用,其次对TCP、HTTP协议简单了解。
HTTPS是基于HTTP协议的一种改进,在 TCP之上 的会话层增加安全处理。对于应用层来说,HTTPS和HTTP没有什么不同,也就是说,HTTPS是保证网络传输的安全性,对业务数据无侵入。
简化理解大概是这个样子:
SSL和TLS是保证安全传输的协议,包括证书认证、加解密和数字签名。
项目中HTTPS的链路:
因此,客户端与后台,编写网络接口时,不需要关心SSL或TLS,按照HTTP协议处理即可。
既然HTTPS在网络传输是经过加密的,那么抓包抓到的数据就是密文,不经过解密是无法看到报文的。针对这个问题,如上图WIFI环境下设置代理的方式可以解决,具体思路是:
所以整个网络链路依然是HTTPS在传输,但代理服务自己可以获取到明文数据。
比较常用的抓包工具大概有4个,主要用作互补,配合使用基本所有平台、所有抓包需求都能满足:
需要说明的是,tcpmp可将数据保存成文件,直接用wireShark打开分析,针对后台或手机抓包使用起来十分方便。
几个工具间的使用关系:
为什么要真机抓包?必定是没有办法设置代理服务了,如4G网络情况下直接和移动基站链接,没法设置代理服务。凡是非4G网络状态下,都不建议真机抓包。
iOS 5后,apple引入了RVI remote virtual interface的特性,它只需要将iOS设备使用USB数据线连接到mac上,然后使用rvictl工具以iOS设备的UDID为参数在Mac中建立一个虚拟网络接口rvi,就可以在mac设备上使用tcpmp,wireshark等工具对创建的接口进行抓包分析。
具体步骤:
android是linux系统,和后台一样可以使用tcpmp命令来抓包,但是需要root权限,因为一般手机系统不带有抓包命令 tcpmp ,需要自行安装。
安装tcpmp:
使用tcpmp:
这是就已经进入抓包状态,手机所有的网络请求都会被捕获,并保存到capture文件中。
导出capture文件:
原文: 网络抓包