ネットワーク環境:
Https クライアント<=============>プロキシ サーバー<==============>Https サーバー
192.168.17.11<-----エクストラネット--- --->192.168.17.22
10.100.21.10<----イントラネット----->10.100.21.11ps: デフォルト ゲートウェイのない 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 も適切な構成に変更する必要があると考えました。