开篇
开篇第一章总得说点多余的东西,本人入坑的时间也有两年时间了,期间遇到的坑不少,但是总觉得都太浅,不值得拿出来聊一聊。而最近发现身边有不少人开始搞起了创作,于是乎又萌生出了分享些什么的想法。今后我也将平时遇到的大大小小的坑拿出来跟大家聊一聊,小码农看看来或许能得到一些启发,老鸟们看来也能投一乐呵。
楔子
抓包或许是诸多小码农们在某一个时间点必须要做的一件事。像是前后端联调的时候前端需要对发出的请求进行抓包,这时用的最多的是Chrome的F12来查看。服务器之间通信出问题,这时候我们会使用tcpdump抓包然后再使用wireshark进行分析。这两个都不是我们这里要讲的,因为前段时间我遇到的需求是对微信进行抓包,并编写第三方微信客户端。这里我们就需要做两件事,一件是对APP发出的报文进行抓取,另一件就是对IDE(本文使用的是idea,eclipse理论上也是类似的)发出的报文进行抓取。这里我们采用的抓包工具均是Fiddler4
第一步:对APP进行抓包
Fiddler的安装我就不废话了,这里直接开始进行配置。在使用前请一定要先开启抓包模式
由于现在的HTTPS已经成为了服务的标配,所以我们需要在Fiddler中开启HTTPS。
由于IOS和Android对证书有着严格的要求,所以我们并不能使用Fiddler导出的正式,不要急,Fiddler为我们提供了满足要求的证书CertMaker。
https://www.telerik.com/fiddler/add-ons
下载安装后,按照国际惯例重启Fiddler4,并拿出手机保证手机与PC机在同一个网段内。
在手机的WIFI设置当中可以看到当前手机和PC机都处于同一个网段,这时在代理选项中选择手动,并将PC的IP和Fiddler设置的代理监听端口对号入座,并点保存。
打开浏览器,输入PC机的IP和Fiddler监听端口,下载证书到本地
然后在文件浏览器(小米5S不能在浏览器的下载列表中点击,只能在文件浏览器中安装)中找到该证书,点击安装,这时会输入锁屏密码。安装完成后此时就可以进行愉快的玩耍了。
走到这一步,各位看官可能觉得并没有什么新的干货,别急,以下部分虽然配置简单,但是里面会有一个意想不到的坑,并且在这部分所花费的时间也是最多的。
第二步:对Idea进行抓包
为了在PC端可以对本地的HTTPS请求进行抓包,我们这里首先需要信任Fiddler的证书。
然后再发起Idea中发起请求,此时我们是无法看到相应的数据。这时对于小码农而言就需要请出万能的度娘,然后搜索Fiddler和Idea相关的信息,可以看到诸如以下的文章
此时可以看到很关键的一步
这时在我们的代码上添加上以上内容,设置了代理的相关内容后,发现依然无法在Fiddler上看到我们发出的请求。这里就很诡异了,经过一番人生思考后,我们决定验证一下这个博客上的代码(其实Fiddler的官网[http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureJavaApp]也是这么配置的,让我们坚信了这个方法是可行的),将代码原样拷贝过来运行以后发现居然可以抓到包了。经过一番折腾后我们发现了两件事。
- HTTP请求在使用这篇博客中的代码是可以被Fiddler抓到包的,而使用我们自己的代码是不可以的
- HTTPS请求在使用这篇博客中的代码是会报错的
第二件事情从上面的错误日志中可以很清晰的看到是证书的问题。本着先易后难,现在我们先来解决HTTPS的问题。
我们需要在Java代码中配置Fiddler的证书,这个流程其实跟APP的抓包是类似的。先下载证书到桌面。
使用最高管理员打开cmd然后进入安装的jdk下的bin目录
输入以下命令,输入口令,选择是以后,会在jdk的bin目录下面会生成一个FiddlerKeystore文件。
keytool.exe -import -file C:\Users\xxxx\Desktop\FiddlerRoot.cer -keystore FiddlerKeystore -alias Fiddler
一定要记住秘钥口令,还需将FiddlerKeystore文件剪切至合适的位置,以供后面使用。这时在代码里添加上以下配置既可对HTTPS请求进行抓包。
可以看到已经在Fiddler中抓取了HTTPS的包。
这时还剩下一个无法在我们自己的程序中通过以上配置在Fiddler中抓取报文的坑。多次试验后发现是因为我们采用的HTTP客户端的问题。在上面这篇博客中使用的HTTP客户端是JAVA自带的客户端,而我们使用的是Apache提供的第三方客户端,两者在使用代码的策略是上不同的。
这个是博客中使用的
这个是我们使用的
大家来感受一下两者的差别:
JAVA自带的HTTP客户端是默认使用系统代理的,而Apache提供的HTTP客户端默认是不使用系统代理,如果想让其使用系统代理需采用如下配置方式
最后我们优化一下代理信息的配置,在代码里面写死代理信息的方式毕竟不是很优雅。
可以将代理信息放在JVM的参数中,其效果是一样的,但这样就保证了对代码的无侵入。
当坑被填平以后,你会发现整个配置的环节极其简单。刚开始觉得复杂的原因还是对自己使用的第三方库了解的不够深入。
至此整个分析过程已经全部结束。这里再做一下下一期的预告,下期我们来讲讲【如何将Spring boot中的启动配置信息放在统一配置管理系统中】
欢迎关注微信公众号,在这里可以提前看到下一期文章哦~