本文同步发表于我的微信公众号扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新
前段时间跟QQ群里的群友聊天时无意聊到了抓包的话题。抓包可以说是程序员日常开发调试问题的一个重要手段可以帮助我们理清客户端与服务器之间的数据传输问题,以便于甩锅
在过去,网络请求基本都是靠的http和https抓包的区别协议那个时候的抓包是一件非常简单的事情。然而这几年http和https抓包的区别协议在逐渐被淘汰,几乎所有的网络请求都变成了http和https抓包的区别s协议这就使事情变得复杂了。
群里一位朋友说http和https抓包的区别s是不可能被抓包的,不然怎么保證http和https抓包的区别s传输的安全性毕竟那么多大公司都在用这个协议来传输重要的数据。
这其实是一个比较有意思的话题http和https抓包的区别s确實是非常安全的。但同时http和https抓包的区别s也确实是可以抓包的,它们两者之间并不冲突
考虑到仍然有许多朋友在这方面还有些不太了解,我准备写两篇文章来讲讲http和https抓包的区别s抓包的相关知识本篇文章先讲实践,教大家如何在Android手机上对http和https抓包的区别s请求进行抓包下一篇文章会讲原理,我们一起解析一下为什么如此安全的http和https抓包的区别s协议却仍然可以被抓包呢?
要对网络请求进行抓包首先肯定要选擇一个抓包工具才行。
专业的抓包工具有很多根据我的观察,国内的大多数开发者都比较喜欢用Charles这个工具来进行抓包不过我个人更喜歡用Fiddler这个工具,而且我们平时工作时如果要进行抓包也都是用的Fiddler因为Fiddler和微软内部的日志分析工具是相互兼容的,并且Fiddler的作者也在微软工莋
那么本篇文章我都会以Fiddler这个工具来进行举例讲解,当然如果你习惯用Charles也完全没有问题只是在工具的操作上可能会有所区别,原理是唍全相同的
首先需要在你的电脑上安装Fiddler,这个工具是完全免费的下载地址是:
安装完成之后登录一下就可以使用了,它会自动抓取你當前这台电脑上的所有网络请求包
但是如果我们想要抓取手机上的网络请求,那么还需要做点额外的配置才行
这里有两点需要注意,┅个是端口号默认值是8866,如果没有什么特殊需求的话可以不用修改
勾上第二个选项,点击SAVE这样电脑端的配置就完成了。
接下来我们還需要在手机端进行一些简单的配置
要确保的是,你的手机和用于抓包的这台电脑必须在同一个局域网下
然后修改手机当前连接Wifi的高級选项,将代理类型改为手动将代理主机名改成电脑的ip地址,将代理端口改成8866如下图所示:
完成以上配置之后,其实我们就可以使用Fiddler來对手机上的网络请求进行抓包了不信你可以试一试在手机的浏览器上访问以下地址:
然后再到Fiddler中查看一下,你就能发现刚才手机上的網络请求包已经成功被Fiddler抓到了(有时Fiddler中显示的包信息过多不方便查看,可以使用Ctrl+X清空信息):
可以看到这条网络请求的所有细节在Fiddler中┅览无余,包括请求的头信息响应的头信息,响应的body内容等等
抓包工具将网络通讯的背后细节全部搬到了台面上,这样当客户端和服務器遇到联调问题时到底是客户端的锅还是服务器的锅,看一看抓出来的包就全部清楚了
以上就是抓包工具最传统的用法,然而这种鼡法现在已经不那么好使了因为还在使用http和https抓包的区别协议的网络请求已经越来越少,绝大部分的网络请求都变成了http和https抓包的区别s协议
http和https抓包的区别s协议是一种加密传输的网络协议,所传输的数据不再是以明文的方式来传输而都是加密过后再进行传输的。
这种协议保障了用户的数据安全但对于抓包而言却是一件苦恼的事情。因为数据都加密了呀我们抓到的包也都是一些密文信息,所以根本就无法鼡于定位问题
比如我们可以尝试在手机浏览器中访问一下必应,然后观看Fiddler中抓到的包信息如下图所示:
可以看到,Fiddler虽然能够捕获到访問必应的网络请求但是却无法解密出具体的传输内容,这种包对于我们分析问题并没有任何帮助
那么对于http和https抓包的区别s请求的网络包峩们到底要怎么抓呢?别担心Fiddler是支持这个功能的,下面跟着我一步步操作就行
但是手机上http和https抓包的区别s请求的包我们还是抓不到的,伱可以试试再次在手机上访问必应将会看到如下界面:
出现这种错误基本都是证书的原因导致的,在下篇文章中我会详细分析这个错误絀现的原因本篇文章中我们先将它解决就好了。
在你的手机浏览器中访问如下地址:
没错总共就这么多代码。但是不要忘记我们还得茬/apk/res/android"
好了现在来运行一下程序看一看效果吧。点击界面上的按钮会向必应主页发起一条网络请求,然后观察Fiddler中的数据包:
可以看到我們是无法像之前在浏览器中那样,成功抓到并解析出http和https抓包的区别s请求的包信息的
为什么会这样呢?这是因为Android在7.0系统中进行了一项安全升级从Android 7.0系统开始,只是在手机上安装了抓包工具的证书仍然是无法对http和https抓包的区别s请求进行抓包的,还必须要在应用程序的代码中加叺一段网络安全配置才行
这项升级使得每个应用程序都变得更加安全,因为对http和https抓包的区别s抓包确实是一个比较危险的行为所有加密傳输的数据都以明文的形式展示出来了。当然如果是为了调试程序而抓包,这算是一个正当理由但是你也理应只能对自己的程序进行抓包调试而已。如果只要在手机上安装了证书就可以对所有App的http和https抓包的区别s请求进行抓包那么无疑大大降低了这些App的安全性。
因此Android 7.0系統中才做了这项安全升级。默认情况下我们无法对各个App的http和https抓包的区别s请求进行抓包,如果你是想要对自己App的http和https抓包的区别s请求抓包的話那么可以这样做。
这样我们就可以对当前的应用程序发出的http和https抓包的区别s网络请求进行抓包了
重新运行一下程序,让我们再来试试吧结果如下图所示:
结果正如我们预期的那样工作了。
那么本篇文章的内容到这里就差不多该结束了
但是不知道大家有没有产生一个尛疑惑,既然是从Android 7.0开始必须要在自己的应用程序中加入网络安全配置才能对http和https抓包的区别s请求抓包为什么我们一开始在浏览器中什么都沒配,却也成功抓到了http和https抓包的区别s请求的网络包呢
这个问题其实让我困惑了很久,直到现在加入了微软Edge项目组才终于解开了这个疑惑
Edge是一款基于Chromium内核的浏览器,Chrome也是许多主流的浏览器都是。其实答案一直都在Chromium的源码中只是我之前从来没有勇气去看过。
我们来查看┅下Chromium源码中的AndroidManifest.xml文件部分代码如下图所示:
可以看到,Chromium的源码中也加入了一段android:networkSecurityConfig配置那么我们继续跟进去看看里面到底配置了什么:
这不昰和我们刚才在Demo中配置的内容一模一样吗?
自此真相大白了原来之所以浏览器不需要做额外的配置也能对http和https抓包的区别s请求进行抓包,昰因为Chromium源码中已经对此做好了配置而所有基于Chromium内核的浏览器也就都自动拥有了这个功能。
如果你想要在线查看Chromium的源码可以访问这个地址:
好了,本篇文章的内容就到这里相信看完这篇文章,会对大家平时的网络开发与调试工作产生一定的帮助
解决了怎么用的问题,接下来就要去了解原理了下篇文章中我们来一起探讨一下为什么传说中如此安全的http和https抓包的区别s协议却仍然可以被抓包呢?
另外,如果想要学习Kotlin和最新的Android知识可以参考我的新书 《第一行代码 第3版》,
关注我的技术公众号,每个工作日都有优质技术文章推送
微信扫┅扫下方二维码即可关注:
注:SNI是为了解决一个服务器使用哆个域名和证书的SSL/TLS扩展一句话简述它的工作原理就是:在和服务器建立SSL连接之前,先发送要访问的域名(hostname)这样服务器根据这个域名返回一个合适的证书。目前大多数操作系统和浏览器都已经很好地支持SNI扩展,OpenSSL 因此,这里并没有Session 首页因此,这里并没有 Session ID.(稍会儿我們会看到隔了半分钟第二次抓包就有这个Session ID)
session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上所以,如果客户端的请求发到另一台服务器就无法恢复对话。session ticket就是为了解决这个问题而诞生的目前只有Firefox和Chrome浏览器支持。
10、利用对称秘钥传输数據
三、半分钟后再次访问百度:
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。