2013-04-10 14 views
12

rete:
Come utilizzare HttpsURLConnection tramite proxy di setProperty? ambiente

Https client < =============> Proxy Server < ==============> Https Server
                                                                                                    192.168.17.11 < ----- extranet ------> 192.168.17.22
10.100.21.10 < ---- intranet -----> 10.10 0.21.11

ps: Http Cliente senza gateway predefinito, ma può ping per 10.100.21.11

Descrizione:

OS: Ubuntu 12.04 su 3 host
Https client: Implementare con java (openjdk-6). Avere un'unica interfaccia di rete.
Server proxy: Apache2.2.Have due interfacce di rete.
Server Https: Tomcat6.Ha un'unica interfaccia di rete.

Utilizzo due metodo per implementare HttpsURLConnection mediante delega:
(Per facilitare non scrivo giù sulla funzione maniglia SSL per controllare serverTrusted e hostnameVerifier issue.If bisogno I aggiornerà.)

classe 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(); 
... 

Questo metodo utilizzabile e ho osservato che il flusso dei pacchetti ha soddisfatto anche le mie aspettative.
HttpClient ---> ProxyServer ---> HTTPServer

Ma quando io uso impostare il metodo di proprietà:

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(); 
... 

ho ottenuto un NoRouteToHostException: Network is unreachable.
Mi fa confondere.Non ho visto alcun pacchetto tra HttpClient e ProxyServer.
Ma HttpClient fare un rumore metallico a ProxyServer (10.100.12.10 ping 10.100.21.11)

Così ho rimuovere impostazioni proxy (come senza l'utilizzo di proxy):
ottenuto anche NoRouteToHostException: Network is unreachable.
Ho pensato che questo è ragionevole. Perché non esiste un percorso per extranet.

Credo che sembra a setProperty metodo che la funzione interna di HttpsURLConnection volontà di controllare questo URL può essere raggiungibile o meno.

Ma è strano. 1o metodo può essere successo.

Hai qualche idea? O quali sono le differenze tra il 1 ° e il 2 ° metodo?

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

Aggiornamento

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

si può lavorare e il flusso di pacchetti sono corretti quello che mi aspetto per.
Ma impostare https.proxyPort = 443 non è praticabile per me

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

Sarà thorow un'eccezione come muggito:

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

Così ho pensato di Apache Proxy devono anche essere modificato per la giusta configurazione .

+0

Non esiste una proprietà come http .proxySet. – EJP

+0

sì. questa proprietà in realtà non ha bisogno di essere impostata.Grazie ~ – CJeremy

risposta

13

La connessione URL è https mentre si imposta solo il proxy http.

Provare a impostare il proxy https.

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

EDIT @EJP è corretta. Non esiste https.proxySet .. Ho copiato la tua domanda originale e inclusa nella risposta.

+0

Non esiste una proprietà come https.proxySet. – EJP

+0

Penso che questa sia la risposta giusta durante l'invio di una richiesta "https" url. la chiave di setProperty è https.proxyHost/proxyPort invece di http.proxyHost/porxyPort. – CJeremy

7

Sarà necessario creare un oggetto Proxy per esso. Creare uno come di seguito:

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

Ora utilizzare questo proxy per creare l'oggetto HttpURLConnection.

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

Se è necessario impostare le credenziali per il proxy, impostare la proprietà Proxy-Authorization richiesta:

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

E, infine, si collegano:

connection.connect(); 
+0

Grazie per la risposta. Per prima cosa, io uso il 1o metodo per creare un oggetto proxy ed è fattibile per me. In secondo luogo, l'URL di cui ho bisogno è "https", quindi penso che usare HttpsURLConnection sia corretto. – CJeremy