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.11ps: 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 .
Nie ma takiego nieruchomość jako http .proxySet. – EJP
tak. ta właściwość naprawdę nie musi być ustawiona. Dziękuję ~ – CJeremy