2013-04-10 14 views
12

sieci:
Jak korzystać z HttpsURLConnection przez proxy przez setProperty? Środowisko

Https Client < =============> Serwer Proxy < ==============> HTTPS
                                                                                                 192.168.17.11 < ----- ekstranetowy ------> 192.168.17.22
10.100.21.10 < ---- intranet -----> 10,10 0.21.11

ps: klient HTTP bez bramy domyślnej, ale można go ping 10.100.21.11

Opis:

OS: Ubuntu 12.04 na 3 zastępów
Https Klienta: Implementacja za pomocą java (openjdk-6). Posiadać jeden interfejs sieciowy.
Serwer proxy: Apache2.2. Posiada dwa interfejsy sieciowe.
Serwer Https: Tomcat6. Mają jeden interfejs sieciowy.

używam dwie metody wdrożyć httpsurlconnection przez pełnomocnika:
(Dla ułatwienia nie zanotować o funkcję uchwytu SSL dla sprawdzenia serverTrusted i hostnameVerifier issue.If trzeba będzie zaktualizować.)

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

Ta metoda działa i obserwowałem przepływ pakietów również spełnił moje oczekiwania.
HttpClient ---> ProxyServer ---> HTTPServer

Ale gdy używam ustawić Właściwość Metoda:

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

mam NoRouteToHostException: Network is unreachable.
To mnie zdezorientowało.Nie widziałem żadnych pakietów między HttpClient i ProxyServer.
Ale HttpClient może ping do ProxyServer (10.100.12.10 ping 10.100.21.11)

Więc usunąć ustawienia proxy (jak bez użycia serwera proxy):
dostał także NoRouteToHostException: Network is unreachable.
Myślałem, że to jest uzasadnione. Ponieważ nie ma trasy do ekstranetu.

myślę, wydaje się, aby setProperty metody, że wewnętrzna funkcja httpsUrlConnection wola, aby sprawdzić ten adres URL może być osiągalny, czy nie.

Ale to jest dziwne. Pierwsza metoda może być sukcesem.

Masz jakiś pomysł? A co różni się między pierwszą a drugą metodą?

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

Aktualizacja

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

może pracować i przepływ pakietów są prawidłowe, czego spodziewać.
Ale ustawić https.proxyPort = 443 nie jest wykonalne dla mnie

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

Będzie thorow wyjątek jak poniżej:

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

Pomyślałem więc Apache Proxy mają także zostać zmodyfikowane do prawej konfiguracji .

+0

Nie ma takiego nieruchomość jako http .proxySet. – EJP

+0

tak. ta właściwość naprawdę nie musi być ustawiona. Dziękuję ~ – CJeremy

Odpowiedz

13

Twoje połączenie URL jest https podczas gdy ustawiasz tylko serwer proxy http.

Spróbuj ustawić serwer proxy https.

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

EDIT @EJP jest poprawna. Nie ma https.proxySet .. Skopiowałem twoje oryginalne pytanie i znalazłem się w odpowiedzi.

+0

Nie ma takiej właściwości, jak https.proxySet. – EJP

+0

Myślę, że jest to właściwa odpowiedź podczas wysyłania adresu URL "https" żądania. Kluczem do setProperty jest https.proxyHost/proxyPort zamiast http.proxyHost/porxyPort. – CJeremy

7

Będziesz musiał utworzyć dla niego obiekt Proxy. Utwórz jedną z poniższych:

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

Teraz użyj tego proxy, aby utworzyć obiekt HttpURLConnection.

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

Jeśli trzeba ustawić poświadczenia dla proxy, należy ustawić właściwość Proxy-Authorization żądanie:

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

I wreszcie, po podłączeniu:

connection.connect(); 
+0

Dziękuję za odpowiedź. Po pierwsze, używam 1. metody tworzenia obiektu proxy i jest to wykonalne dla mnie. Po drugie, URL, którego potrzebuję, to "https", więc uważam, że użycie funkcji HttpsURLConnection jest poprawne. – CJeremy

Powiązane problemy