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 ...
_
フィドラーを閉じると、プログラムは例外なく正常に実行され、接続しているURLでhtmlが生成されます。
代わりに、System.setProperty("https.proxyPort", "443");
の代わりにSystem.setProperty("https.proxyPort", "8888");
を指定すると、fiddlerが開いている間、キャプチャモードで、例外なくすべてのhtmlを実行および印刷しますが、まだありませんフィドラーからのキャプチャー。
その後、_-DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888
_のようなEclipseのjvm引数を使用してこれらのシステムプロパティを設定すると、キャプチャモードと非キャプチャモードの両方でフィドラーアプリが実行されている限り、まったく同じ例外が再び発生します。フィドラーを閉じると、プログラムは完全に正常に実行されます。
System.setProperty("http.proxyHost", "127.0.0.1");
の代わりにSystem.setProperty("http.proxyHost", "localhost");
を使用する場合、fiddlerアプリケーションの実行、cap/nonキャプチャモードの両方で正常に実行されますが、キャプチャされたトラフィックもありません。
Webブラウザではなく、Javaプログラム?jvm引数は何ですか、それをどのように設定しますか?これ?
Fiddler証明書を含むキーストアを作成します。このキーストアを、プロキシ設定とともにJVMのトラストストアとして使用します。
その方法は次のとおりです。
ツール-> Fiddlerオプション...-> HTTPS->ルート証明書をデスクトップにエクスポート
管理者としてコマンドラインを開きます(それ以外の場合、keytoolは機能しません)
<JDK_Home>\bin\keytool.exe -import -file C:\ Users\<ユーザー名>\Desktop\FiddlerRoot.cer -keystore FiddlerKeystore -alias Fiddler
プロンプトが表示されたらパスワードを入力します。これにより、FiddlerKeystoreというファイルが作成されます。
-DproxySet = true
-DproxyHost = 127.0.0.1
-DproxyPort = 8888
-Djavax.net.ssl.trustStore = <path\to\FiddlerKeystore>
-Djavax.net.ssl.trustStorePassword = <キーストアパスワード>
これらのvmargsをEclipse実行構成で使用すると、準備ができているはずです。
このセットアップで問題なく、JVMから作成されたHTTPS要求をキャプチャできます。
フィドラーキーをJava信頼できる証明書ストアにインポートすることもできます。
Fiddlerのルート証明書をエクスポートする
ツール-> 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それを変更
また、Google API ClientのhttpsトラフィックをFiddlerで復号化する際に問題が発生しました。問題は、デフォルトで独自の証明書ストアを使用することでした:
InputStream keyStoreStream = GoogleUtils.class.getResourceAsStream("google.jks");
SecurityUtils.loadKeyStore(certTrustStore, keyStoreStream, "notasecret");
そして、これは私がこれを修正した方法です:
HttpTransport transport = new NetHttpTransport()
//istead of transport = GoogleNetHttpTransport.newTrustedTransport();
フィドラー証明書を含むキーストアを作成して使用します。
Java -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888 -Dhttps.proxyPort=8888 -Dhttps.proxyHost=127.0.0.1 -Djavax.net.ssl.trustStore=<path to FiddlerKeystore> -Djavax.net.ssl.trustStorePassword=<password> -jar test.jar
サードパーティのHTTPライブラリを使用する場合、接続プロキシを設定する必要があります。 Apache Commons HttpClientの例:
HttpClient httpClient = new HttpClient();
httpClient.getHostConfiguration().setProxy("localhost", 8888);
更新:
apache HttpClient 4.5.5以降を使用している場合は、次のようにする必要があります。
HttpHost proxy = new HttpHost("localhost", 8888, "http");
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
CloseableHttpClient httpclient = HttpClients.custom()
.setRoutePlanner(routePlanner)
.build();
次のJavaコマンドラインオプションも必要であることがわかりました
-Dhttps.proxyPort=8888
-Dhttps.proxyHost=127.0.0.1