2013-04-10 3 views
12

네트워크 환경 :
setProperty를 통해 HttpsURLConnection을 프록시를 통해 사용하는 방법은 무엇입니까?

HTTPS를 클라이언트 < =============> 프록시 서버 < ==============> HTTPS를 서버
                                        01 237,819,                                                          192.168.17.11 < ----- 익스트라 ------> 192.168.17.22
10.100.21.10 < ---- 인트라넷 -----> 10.10 0.21.11

추신 : 기본 게이트웨이없이 HTTP를 클라이언트하지만 10.100.21.11

설명에 Ping 할 수 있습니다 :

OS : 우분투 12.04 세에 호스트
HTTPS를 클라이언트 : java (openjdk-6)로 구현하십시오. 하나의 네트워크 인터페이스가 있어야합니다.
프록시 서버 : Apache2.2.Have 두 네트워크 인터페이스.
Https 서버 : Tomcat6.Have 하나의 네트워크 인터페이스. 촉진
(를 들어 내가 SSL 핸들 기능에 대해 기록해 두지 않는 확인하기 위해 issue.If 및 의 hostnameVerifier을 serverTrusted 내가 업데이트 할 필요

나는 프록시를 통해 HttpsURLConnection에을 구현하는 두 가지 방법을 사용합니다.)

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에

하지만 설정 재산권 방법을 사용하는 경우 : 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는 방법처럼 보인다 같아요.

하지만 이상합니다. 첫 번째 방법은 성공 일 수 있습니다.

의견이 있으십니까? 아니면 첫 번째와 두 번째 방법이 다른가요?

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

업데이트

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

그것은 작동 할 수 및 패킷 흐름은 I가 기대하는 것을 정확합니다.
그러나 나를

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

그것은 벨으로 예외를 thorow 것이기 실행할 수없는 https.proxyPort = 443 설정 :

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

그래서 나는 아파치 프록시는이 올바른 구성을 수정할 생각 .

+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"); 

편집 @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

답장을 보내 주셔서 감사합니다. 첫째, 첫 번째 방법은 프록시 개체를 만드는 것이고 그것은 나를 위해 실행할 수 있습니다. 둘째로, URL이 "https"이므로 HttpsURLConnection을 사용하는 것이 맞다고 생각합니다. – CJeremy