Fiddler 抓包 HTTPS 无法正常解密HTTPS数据, Host 总是显示 Tunnel to,而不是域名?
Fiddler抓HTTPS的原理是:
设置系统代理为Fiddler自己(127.0.0.1:8888),然后让程序通过Fiddler再去访问目标并返回给程序实现抓取和分析HTTPS,相当于一个中间人攻击。
Fiddler会生成自签名ROOT证书并加入系统胜任根证书列表当中,然后当程序访问的时候会通过根证书颁发一个证书给应用程序,如果通过Java或者第三方程序访问,因为Fiddler生成的ROOT根证书不被第三方程序信任,可能无法正常访问,所以我们必须让第三方引用信任Fiddler根证书,才能保证正常。Chrome、Edge等使用了Windows证书存储的应用程序会自动信任Fiddler的根证书,无需特殊操作,但Java/JRE却有自己的根证书存储,我们必须采取特殊方式配置。
如果需要用Fiddler抓取Java程序的HTTPS包,需要配置如下:
1. Fiddler 中,Tools, Options,设置 Capture HTTPS Connects,并勾选Decrypt HTTPS traffic,勾选 "Ignore server certificate errors (unsafe)
2. 设置Certifcates generated by "MakeCert engine",然后点击 [Actions],Reset All Certifcates,操作之后点击 [Trust Root Certificate]
3. 设置 Skip description for the following hosts,如下图:
4. 导出Fiddler根证书,并导入Java。如上图,点击 Actions ,然后点击 Export Root Certificate to Desktop,会在桌面生成一个 FiddlerRoot.cer 文件。
5. 导入Fiddler根证书到Java根证书存储中,找到 Java JRE/JDK目录,如 %JAVA_HOME%\lib\security,在此目录打开 cmd(命令提示符),然后输入指令:
"..\..\bin\keytool.exe" -import -keystore cacerts -storepass changeit -file %USERPROFILE%\Desktop\FiddlerRoot.cer
6. 在Java程序中,设置 HTTPS 代理为 127.0.0.1:8888,即在Java 程序入口开始添加代码:
public static void main(String[] args) {
System.setProperty("https.proxyHost", "127.0.0.1");
System.setProperty("https.proxyPort", "8888");
SpringApplication.run(Application.class, args);
}
如果不想修改代码,可以通过JVM参数,即Java命令行增加下面的参数实现代理:
-DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888
重启Java应用程序,应该就能正确在Fiddler中解密HTTPS访问了。