web-dev-qa-db-ja.com

javaで、フィドラーでhttpsをキャプチャする方法

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引数は何ですか、それをどのように設定しますか?これ?

50
Sam Adamsh

Fiddler証明書を含むキーストアを作成します。このキーストアを、プロキシ設定とともにJVMのトラストストアとして使用します。

その方法は次のとおりです。

  • Fiddlerのルート証明書をエクスポートする

ツール-> Fiddlerオプション...-> HTTPS->ルート証明書をデスクトップにエクスポート

  • この証明書でキーストアを作成します

管理者としてコマンドラインを開きます(それ以外の場合、keytoolは機能しません)

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

プロンプトが表示されたらパスワードを入力します。これにより、FiddlerKeystoreというファイルが作成されます。

  • 次に、Fiddlerをプロキシとして、このキーストアをトラストストアとしてJVMを起動します。次のvmargsが必要です。

-DproxySet = true

-DproxyHost = 127.0.0.1

-DproxyPort = 8888

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

-Djavax.net.ssl.trustStorePassword = <キーストアパスワード>

これらのvmargsをEclipse実行構成で使用すると、準備ができているはずです。

このセットアップで問題なく、JVMから作成されたHTTPS要求をキャプチャできます。

98
CodeMangler

フィドラーキーをJava信頼できる証明書ストアにインポートすることもできます。

  1. Fiddlerのルート証明書をエクスポートする

    ツール-> Fiddlerオプション...-> HTTPS->アクション->ルート証明書をデスクトップにエクスポート

  2. 管理者として実行:

"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();
4
zenden2k

フィドラー証明書を含むキーストアを作成して使用します。

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();
4
Dimmduh

次のJavaコマンドラインオプションも必要であることがわかりました

-Dhttps.proxyPort=8888 
-Dhttps.proxyHost=127.0.0.1
2
Brook