使用Fiddler对Java程序进行抓包
Fiddler是常用的一个抓包工具,可以通过这个工具对Java程序的进行抓包。
第一步是设置代理
1
2
3
4static {
System.setProperty("proxyHost", "localhost");
System.setProperty("proxyPort", "8888");
}或者添加JVM参数:
-DproxyHost=localhost -DproxyPort=8888
网上很多教程是将Http的代理和Https的代理分开,实际上通过
proxyPort
和proxyHost
两个属性能够一次性设置Http的代理和Https的代理。分析源码中的
DefaultProxySelector
类可以看到这段话:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
* This is where we define all the valid System Properties we have to
* support for each given protocol.
* The format of this 2 dimensional array is :
* - 1 row per protocol (http, ftp, ...)
* - 1st element of each row is the protocol name
* - subsequent elements are prefixes for Host & Port properties
* listed in order of priority.
* Example:
* {"ftp", "ftp.proxy", "ftpProxy", "proxy", "socksProxy"},
* means for FTP we try in that oder:
* + ftp.proxyHost & ftp.proxyPort
* + ftpProxyHost & ftpProxyPort
* + proxyHost & proxyPort
* + socksProxyHost & socksProxyPort
*
* Note that the socksProxy should *always* be the last on the list
*/
static final String[][] props = {
/*
* protocol, Property prefix 1, Property prefix 2, ...
*/
{"http", "http.proxy", "proxy", "socksProxy"},
{"https", "https.proxy", "proxy", "socksProxy"},
{"ftp", "ftp.proxy", "ftpProxy", "proxy", "socksProxy"},
{"socket", "socksProxy"}
};props这个二维数组的每一维第一个元素是协议类型,剩下的元素是
Host
和Port
这两个属性的前缀。比如数组的第一维对应Http协议,前缀有http.proxy
,proxy
,socksProxy
这三个,那么就可以组成3对有效的代理属性。代理主机 代理端口 http.proxy Host
http.proxy Port
proxy Host
proxy Port
socksProxy Host
socksProxy Port
因此可以看到对于Http协议和Https协议
proxyHost
和proxyPort
属性都生效。想要抓取Https数据需要导入Fiddler的证书
在JDK的
lib\security
目录下有一个cacerts
文件,是受信任的证书颁发机构(CA)的证书集合,我们要做的就是把Fiddler的根证书加入到cacerts
文件。备份
cacerts
文件,拷贝一份并重命名为cacerts.bak
导出Fiddler的根证书
FiddlerRoot.cer
并和cacerts
文件放在一起执行以下命令
1
keytool -import -keystore ./cacerts -trustcacerts -file .\FiddlerRoot.cer -storepass changeit
效果
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 徇的小站!
评论