HTTPS数据包抓取的可行性分析
相信只要是从事软件开发, 多多少少都会涉及到数据包的抓取。常见的有网页数据抓取(即网页爬虫),应用程序数据包抓取等。网页数据抓取比较简单, 在chrome下可以非常方便的分析网页结构和数据请求;而应用程序数据包的抓取则相对复杂些, 通常需要配置代理软件。常用的代理软件有paros, mitmproxy, honeyproxy等。若是你的路由器支持, 你甚至可以直接在电脑上使用wireshark捕捉其他ip的数据包。
paros 是一种轻量型的数据包抓取软件, 自带代理服务器, 配置非常简单。 其配置方法可以参考使用Paros监控iPhone发出的HTTP请求。paros 是用java编写的, 跨平台, 支持windows, mac, linux。
mitmproxy 是python编写的数据包抓取软件, 使用控制台作为操作界面。提供libmproxy工具包。
honeyproxy 基于 mitmproxy, 提供比较友好的交互界面。
通常,简单的未加密的http数据包是非常容易抓取的, 只要简单的配置下paros就可以了。 因为, http未加密, 所有的数据都是明文传输的, 配置代理后, 代理可以直接读取到这些通信数据包。
然而, https 则不行, 即便是通过代理进行数据传输, 流过代理的数据也是经过ssl加密的, 代理当然没有办法解密通信数据包。
首先来普及下https的知识。
Https 通信时序
https 对应的通信时序图如下:
- 服务器在接受到客户端发起https连接请求后, 将返回该网站的证书(根证书信息等)
- 客户端将校验网站证书的合法性。
- 验证通过后,客户端产生随机的对称密钥。
- 客户端使用网站证书的公钥加密对称密钥, 并发送给服务器端。
- 服务器端收到对称密钥后, 就可以进行利用对称密钥的密文通信了。
每一个https的网站都会向证书颁发机构(CA)申请一个网站证书, 这个证书实际是非对称加密的公钥密钥对, 利用非对称加密算法的特殊性, 可以在理论上避免第三方窃听。
非对称加密算法的原理
假设有A, B 两方, 双方都有一对密钥(公钥和私钥)。公钥是对外开放的, 任何人都可以得到;私钥是自己的, 别人是获取不到的。公钥和私钥是相对应的, 利用公钥进行加密, 只能用私钥解密, 使用公钥无法解密; 利用私钥解密, 则只能用公钥解密, 使用私钥也无法解密。
利用A的公钥对数据进行加密, 则只有A的私钥可以解密, 任何第三方都不可以解密数据。 这样可以在不安全的通道上进行数据传输, 保证只有A可以解密数据, 任何第三方只能窃听到已加密的数据, 即便拥有公钥也无法进行解密操作。
利用A的私钥对约定好的数据加密, 发送给B。 B可以使用公钥进行解密, 从而验证A的身份。任何第三方都无法模拟这样加密后的数据。这种形式广泛用于电子签名等。
对非对称加密算法不了解的同学, 可以参考百度百科.
Https加密通信原理
Https 加密通信利用非对称加密算法
和对称算法
, 使用非对称加密算法验证身份
和发送对称密钥
, 使用对称算法
加密通信数据。
证书实际就是非对称加密算法的公钥
和私钥
, 分为两大类, 根证书
和网站证书
。
-
根证书
属于证书颁发结构, 根证书的公钥默认内嵌在我们的系统中。运行命令win+r
运行certmgr.msc
可以查看在系统中的根证书列表。 -
网站证书
带有根证书的私钥签名
, 在https握手开始阶段由网站服务器发送给客户端。 客户端收到网站证书
后, 立即校验证书的有效性。校验方法是: 取根证书的私钥签名, 利用客户端系统内嵌的根证书公钥解密。 解密成功, 则证书有效。
聊到这里, 我们可以看出若想伪造网站证书进行https代理, 必须导入自己的根证书到系统中, 才能使客户端认为伪造的网站证书是有效的。
伟大的* 就是用这种原理实现的, 因此从严格的角度上来说, *是不安全的, 有被窃听的危险。不过, 屌丝怕啥, 随便窃...
所以, 有人说没办法抓取https 的数据包, 这是不正确的。 经过一些配置还是可以抓取https 数据包的。可惜我跟个傻帽似的还跟honeyproxy 的作者探讨怎么加入https的支持, 羞愧死了。
mitmproxy实际上是支持抓取https数据包的。在官方文档里面, 甚至将Firefox, OSX, Windows7, iOS, Android 怎么配置根证书都说的一清二楚。Android的配置地址是http://mitmproxy.org/doc/certinstall/android.html。 可惜我在我的手机Galaxy Nexus( 4.2 Stock ROM)上测试没成功。
Android 2.X 与 Android 4.1 以及Android 4.2 的根证书配置方式都不同。 若是有同学搞定这个问题, 分享下心得哈.