15

ネットワーク環境:

Https クライアント<=============>プロキシ サーバー<==============>Https サーバー
                                                  192.168.17.11<-----エクストラネット--- --->192.168.17.22
10.100.21.10<----イントラネット----->10.100.21.11

ps: デフォルト ゲートウェイのない HTTP クライアントですが、10.100.21.11 に ping できます

説明:

OS: 3 つのホスト上の Ubuntu 12.04
Https クライアント: java(openjdk-6) で実装します。1 つのネットワーク インターフェイスがあります。
プロキシ サーバー: Apache2.2。2 つのネットワーク インターフェイスを備えています。
Https サーバー: Tomcat6.1 つのネットワーク インターフェイスを持っています。

プロキシを介してhttpsurlconnection実装するために 2 つの方法を使用
ます

1.プロキシクラス

InetSocketAddress proxyInet = new InetSocketAddress("10.100.21.11",80);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyInet);
URL httpsUrl = new URL("https://192.168.17.22:8443/test");
HttpsURLConnection httpsCon = (HttpsURLConnection) httpsUrl.openConnection(proxy);

httpsCon.setDoOutput(true);
httpsCon.setDoInput(true);
httpsCon.setRequestMethod("POST");
OutputStream out = httpsCon.getOutputStream();
OutputStreamWriter owriter = new OutputStreamWriter(out);

owriter.write("<request>test</request>");
owriter.flush();
owriter.close();
...

この方法は実行可能であり、パケット フローも期待どおりであることがわかりました。
HttpClient ---> ProxyServer ---> HttpServer

しかし、set Property メソッドを使用すると、次のようになります。

2.プロパティの設定

System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost",10.100.21.11);
System.setProperty("http.proxyPort","80");

URL httpsUrl = new URL("https://192.168.17.22:8443/test");
HttpsURLConnection httpsCon = (HttpsURLConnection)httpsUrl.openConnection();

httpsCon.setDoOutput(true);
httpsCon.setDoInput(true);
httpsCon.setRequestMethod("POST");
OutputStream out = httpsCon.getOutputStream();
OutputStreamWriter owriter = new OutputStreamWriter(out);

owriter.write("<request>test</request>");
owriter.flush();
owriter.close();
...

を手に入れましたNoRouteToHostException: Network is unreachable
混乱します。HttpClient と ProxyServer の間にパケットは見られませんでした。
ただし、HttpClient は ProxyServer (10.100.12.10 ping 10.100.21.11) に ping できます。

したがって、プロキシ設定を削除します(プロキシを使用しない場合と同様):
また、取得しNoRouteToHostException: Network is unreachableました。
エクストラネットへのルートがないので、これは妥当だと思いました。

httpsUrlConnectionの内部関数がこの URL に到達できるかどうかを確認するsetPropertyメソッドのように思われます。

しかし、それは奇妙です。最初の方法は成功する可能性があります。

アイデアはありますか?または、1番目と2番目の方法の違いは何ですか?

++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++

アップデート

System.setProperty("https.proxyHost",10.100.21.11);
System.setProperty("https.proxyPort","80"); 

それは機能し、パケットフローは私が期待するとおりです。
しかし、設定 https.proxyPort=443 は機能しません

System.setProperty("https.proxyPort","443");

次のように例外をスローします。

java.net.SocketException: Unexpected end of file from server 
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:770)
....

そのため、Apache Proxy も適切な構成に変更する必要があると考えました。

4

3 に答える 3

19

URL 接続は https ですが、http プロキシのみを設定しています。

https プロキシを設定してみてください。

//System.setProperty("https.proxySet", "true"); 
 System.setProperty("https.proxyHost",10.100.21.11);
 System.setProperty("https.proxyPort","443");

EDIT @EJP は正しいです。https.proxySet はありません。元の質問をコピーして回答に含めました。

于 2013-04-10T13:39:41.630 に答える