我在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正在RUNNING,则在捕获和捕获时会产生以下异常:
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,没有例外,即使在fiddler打开时,在捕获模式下,但仍然没有从fiddler捕获 .
然后,如果我通过eclipse的jvm参数设置这些系统属性,如: -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888
,只要fiddler应用程序正在运行,同样会发生同样的异常,无论是捕获模式还是非捕获模式 . 如果我关闭小提琴手,该程序将运行完美 .
如果我使用: System.setProperty("http.proxyHost", "127.0.0.1");
而不是: System.setProperty("http.proxyHost", "localhost");
,它可以运行fiddler应用程序运行,无论是捕获/非捕获模式,还是没有捕获的流量 .
有人在那里,能够用fiddler捕获他们自己的https流量,不是通过网络浏览器,而是通过java程序?什么是jvm参数,你如何设置它来做到这一点?谢谢
4 回答
创建包含Fiddler证书的密钥库 . 将此密钥库用作JVM的信任库以及代理设置 .
以下是如何做到这一点:
出现提示时输入密码 . 这应该创建一个名为FiddlerKeystore的文件 .
在你的eclipse运行配置中使用这些vmargs你应该很高兴 .
我能够捕获从JVM发出的HTTPS请求,而不会出现此设置的任何问题 .
您还可以将fiddler密钥导入java可信证书库:
工具 - > Fiddler选项... - > HTTPS - >操作 - >将根证书导出到桌面
“keytool.exe”-import -noprompt -trustcacerts -alias FiddlerRoot -file c:\ work \ FiddlerRoot.cer -keystore“C:\ Program Files \ Java \ jdk1.7.0_79 \ jre \ lib \ security \ cacerts”-storepass更改
此外,我还遇到了使用Fiddler解密Google API客户端的https流量的问题 . 问题是默认情况下它使用它自己的证书存储:
这就是我解决这个问题的方法:
创建一个包含fiddler证书的密钥库并使用它:
如果使用第三方HTTP库,则需要设置连接代理 . Apache Commons HttpClient示例:
UPDATE:
如果您使用的是Apache HttpClient 4.5.5或更高版本,则需要这样做:
我发现我还需要以下java命令行选项