Fiddler是常用的一个抓包工具,可以通过这个工具对Java程序的进行抓包。

  1. 第一步是设置代理

    1
    2
    3
    4
    static {
    System.setProperty("proxyHost", "localhost");
    System.setProperty("proxyPort", "8888");
    }

    或者添加JVM参数:-DproxyHost=localhost -DproxyPort=8888

    网上很多教程是将Http的代理和Https的代理分开,实际上通过proxyPortproxyHost两个属性能够一次性设置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这个二维数组的每一维第一个元素是协议类型,剩下的元素是HostPort这两个属性的前缀。比如数组的第一维对应Http协议,前缀有http.proxy, proxy, socksProxy这三个,那么就可以组成3对有效的代理属性。

    代理主机 代理端口
    http.proxyHost http.proxyPort
    proxyHost proxyPort
    socksProxyHost socksProxyPort

    因此可以看到对于Http协议和Https协议proxyHostproxyPort属性都生效。

  2. 想要抓取Https数据需要导入Fiddler的证书

    在JDK的lib\security目录下有一个cacerts文件,是受信任的证书颁发机构(CA)的证书集合,我们要做的就是把Fiddler的根证书加入到cacerts文件。

    1. 备份cacerts文件,拷贝一份并重命名为cacerts.bak

    2. 导出Fiddler的根证书FiddlerRoot.cer并和cacerts文件放在一起

    3. 执行以下命令

      1
      keytool -import -keystore ./cacerts -trustcacerts -file .\FiddlerRoot.cer -storepass changeit
  3. 效果