Я запускаю следующую java-программу в Eclipse IDE:
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, программа работает нормально без каких-либо исключений, выдавая html на url, к которому я подключаюсь.
альтернативно, если я укажу System.setProperty("https.proxyPort", "443");
, вместо: System.setProperty("https.proxyPort", "8888");
, он запускается и выводит весь html, без исключений, даже когда fiddler открыт, в режиме захвата, но захвата из fiddler все еще нет вообще.
Затем, если я устанавливаю эти системные свойства через аргументы jvm в eclipse, например: -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 capturing, но также НЕТ захваченного трафика.
Кто-нибудь может перехватить свой собственный https трафик с помощью fiddler, НЕ через веб-браузер, а через java-программу? Какие аргументы jvm, как настроить ее для этого? спасибо