gpt4 book ai didi

java - 如何在 java 中使用 fiddler 捕获 https

转载 作者:IT老高 更新时间:2023-10-28 20:31:01 26 4
gpt4 key购买 nike

我在 Eclipse IDE 中运行以下 java 程序:

import java.net.*;
import java.io.*;

public class HH
{
public static void main(String[] args) throws Exception
{
//if i comment out the system properties, and don't set any jvm arguments, the program runs and prints out the html fine.
System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", "8888");
System.setProperty("https.proxyHost", "localhost");
System.setProperty("https.proxyPort", "8888");

URL x = new URL("https://www.google.com");
HttpURLConnection hc = (HttpURLConnection)x.openConnection();

hc.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.0)
AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2");

InputStream is = hc.getInputStream();

int u = 0;
byte[] kj = new byte[1024];
while((u = is.read(kj)) != -1)
{
System.out.write(kj,0,u);
}
is.close();
}
}

如果 fiddler 在捕获和不捕获时都在运行,则会产生以下异常:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown ...

如果我关闭 fiddler,程序运行良好,没有任何异常,在我连接的 url 上生成 html。

或者,如果我指定 System.setProperty("https.proxyPort", "443");,而不是:System.setProperty("https.proxyPort", "8888");,它运行并打印出所有的 html,无一异常(exception),即使 fiddler 处于打开状态,处于捕获模式,但仍然没有从 fiddler 捕获。

然后,如果我通过 Eclipse 的 jvm 参数设置这些系统属性,例如:-DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888,只要 fiddler 再次发生同样的异常应用程序正在运行,无论是在捕获模式还是非捕获模式。如果我关闭 fiddler,程序将运行得很好。

如果我使用:System.setProperty("http.proxyHost", "127.0.0.1"); 而不是:System.setProperty("http.proxyHost", "localhost");,它在 fiddler 应用程序运行时运行良好,无论是 cap-/non 捕获模式,但也没有捕获流量。

有没有人能够使用 fiddler 捕获他们自己的 https 流量,而不是通过网络浏览器,而是通过 java 程序? jvm 参数是什么,你如何设置它来做到这一点?谢谢

最佳答案

创建一个包含 Fiddler 证书的 keystore 。将此 keystore 与代理设置一起用作 JVM 的信任库。

这是如何做到这一点的:

  • 导出 Fiddler 的根证书

Tools -> Fiddler Options... -> HTTPS -> Export Root Certificate to Desktop

  • 使用此证书创建 keystore

Open command line as administrator (keytool doesn't work otherwise)

<JDK_Home>\bin\keytool.exe -import -file C:\Users\<Username>\Desktop\FiddlerRoot.cer -keystore FiddlerKeystore -alias Fiddler

出现提示时输入密码。这应该会创建一个名为 FiddlerKeystore 的文件。

  • 现在启动 JVM,将 Fiddler 作为代理,将此 keystore 作为信任库。您将需要这些 vmarg:

-DproxySet=true

-DproxyHost=127.0.0.1

-DproxyPort=8888

-Djavax.net.ssl.trustStore=<path\to\FiddlerKeystore>

-Djavax.net.ssl.trustStorePassword=<Keystore Password>

在你的 Eclipse 运行配置中使用这些 vmargs,你应该很高兴。

我能够捕获从 JVM 发出的 HTTPS 请求,而此设置没有任何问题。

关于java - 如何在 java 中使用 fiddler 捕获 https,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8549749/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com