14

http.proxyPortと の設定に依存する Java アプリケーションを作成していましたhttp.proxyHost。2 つのプロセスがあります。1 つは通常のプログラムで、もう 1 つはプロキシです。(私が制御する)単純なソケットリスナーを実行していますhttp.proxyPort。それは次のように簡単です

while (true) {
    try {
    Socket connection = server.accept();

    Handler handler = new Handler(connection);
    handler.start();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

したがって、「プロセス1」がhttpリクエストを行うたびに-のように

URL yahoo = new URL("http://www.google.ca/");
URLConnection yc = yahoo.openConnection();
System.out.println(yc.getClass().getName());
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));

プロキシを経由します。クライアントが HTTPS プロトコルを使用している場合はどうなるでしょうか。代わりにhttps://google.ca?を使用します。プロパティhttps.proxyPortとがありますhttps.proxyHostが、私は文字通り何ヶ月もの間 (オンとオフ、それほど重要ではありません) 幸運なく試してきました。私はたくさんのスレッドを読みました(私が何かをしたことがわかるように、最後にいくつかリストします)。

これまでの私の最も近い試み:サーバー

try {
    System.setProperty("javax.net.ssl.keyStore", "test.jks");
    System.setProperty("javax.net.ssl.keyStorePassword", "2520xe");

    SSLServerSocketFactory sslserversocketfactory =
            (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
    SSLServerSocket sslserversocket =
            (SSLServerSocket) sslserversocketfactory.createServerSocket(9999);
    System.out.println("Ready");
    SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();

    InputStream inputstream = sslsocket.getInputStream();
    InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
    BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

    OutputStream toClient = sslsocket.getOutputStream();
    toClient.write(("HTTP/1.0 200 Connection established\n" +
            "Content-Length: " + "Shut down!".getBytes().length
                                     + "\r\n").getBytes("utf-8"));
    toClient.write("Shut down!".getBytes("utf-8"));
    toClient.close();
} catch (Exception exception) {
    exception.printStackTrace();
}

クライアント

try {
    System.setProperty("https.proxyHost", "127.0.0.1");
    System.setProperty("https.proxyPort", "9999");
    URL yahoo = new URL("https://www.google.ca/");
    URLConnection yc = yahoo.openConnection();
    System.out.println(yc.getClass().getName());
    BufferedReader in = new BufferedReader(
                new InputStreamReader(
                yc.getInputStream()));
    String inputLine;

    while ((inputLine = in.readLine()) != null) 
    System.out.println(inputLine);
    in.close();
} catch (Exception ex) {
    ex.printStackTrace();
}

そして、私javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?はそれをググったが、代わりにいくつかのメールのものを思いついた。

https.proxyPort基本的に、フラグによってクライアントに設定された Java プロキシ サーバーを作成する必要があり、https.proxyHostデータをクライアント アプリに送り返すことができますURL connection = new URL("https://...")

私が試したいくつかのサイト...

  • HTTPS を受け入れる Java Proxy Server の作成
  • http://stilius.net/java/java_ssl.php
  • Java がすべての証明書を受け入れるようにすることについては他にもありましたが、リンクが見つかりません。コードはありますが、現在行っていることよりも多くのエラーが発生しましたが、役立つ場合は含めることができます (これはすでに長い質問であるため、最初は含めませんでした)
4

2 に答える 2

1

HTTPS プロトコルの URLConnection のデフォルトの Java SE7 実装は、パラメータ
https.proxyHostおよびhttps.proxyPortを使用します

Tomcat に追加:

-Dhttps.proxyHost="192.168.121.31" -Dhttps.proxyPort="3128"

于 2015-02-04T14:01:09.190 に答える