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