2013-04-10 21 views
12

ネットワーク環境:
setPropertyによるHttpsURLConnectionの使用方法

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

は、PS:デフォルトゲートウェイ無しのHTTPクライアントが、それが10.100.21.11

説明にpingできる:

OS:Ubuntuの12.04 3上のホスト
HTTPSクライアント: java(openjdk-6)を実装する。一つのネットワークインタフェースを持つ。
Proxy Server:Apache2.2.Have 2つのネットワークインターフェイス。
Httpsサーバー:Tomcat6.Have 1つのネットワークインターフェイス。

私はプロキシを介してのHttpsURLConnectionを実装するための2つのメソッドを使用します(促進のために、私はをチェックするためにSSLハンドル機能について書き留めていないのHostnameVerifier issue.IfをserverTrusted
は私が更新する必要があります。 )

1.Proxyクラス

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プロパティメソッドを使用する場合:

2.setProperty

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ピング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に設定それは怒鳴るように例外をthorowます私のため

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のプロキシがまた右の設定に変更する必要があると思いました。

+0

をHTTPとしてはそのようなプロパティはありません.proxySet。 – EJP

+0

はい。このプロパティは実際には設定する必要はありません。ありがとう〜 – CJeremy

答えて

13

httpプロキシを設定しているだけで、URL接続はhttpsです。

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

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

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

+0

https.proxySetのようなプロパティはありません。 – EJP

+0

「https」というURLをリクエストしている間、これが正しい答えだと思います。 setPropertyのキーはhttpsです。http.proxyHost/porxyPortではなくproxyHost/proxyPortを使用します。 – CJeremy

7

Proxyオブジェクトを作成する必要があります。

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyServer, Integer.parseInt(proxyPort))); 

今すぐHttpURLConnectionオブジェクトを作成するには、このプロキシを使用:以下のようなものを作成します。プロキシの資格情報を設定する必要がある場合

HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(proxy); 

は、Proxy-Authorization要求プロパティを設定します。

String uname_pwd = proxyUsername + ":" + proxyPassword 
String authString = "Basic " + new sun.misc.BASE64Encoder().encode(uname_pwd.getBytes()) 
connection.setRequestProperty("Proxy-Authorization", authString); 

そして最後に、あなたが接続します

connection.connect(); 
+0

ありがとうございます。 最初に、私はプロキシオブジェクトを作成する第1の方法を使用し、それは私のために実行可能です。 第2に、私が必要とするURLは「https」なので、HttpsURLConnectionを使用することが正しいと思います。 – CJeremy

関連する問題