2

HTTP 클라이언트가 일반 HTTP 요청을 프록시에 안전하게 보낼 수 있도록 HTTPS 프록시를 설정했습니다. 예를 들어, 클라이언트는 암호화 된 HTTP GET 요청을 프록시에 보내면 암호화가 제거되고 최종 HTTP GET 요청이 최종 사이트로 전송됩니다.HttpRouteP lanner - HTTPS 프록시와 함께 작동하는 방법

이 설정은 일반적인 설정이 아니며 Google 크롬에서만 이러한 시나리오를 지원하는 내장 기능이 있다는 것을 알았습니다. (여기에 정보 - http://wiki.squid-cache.org/Features/HTTPS#Encrypted_browser-Squid_connection). Google 크롬을 내 HTTPS 프록시와 함께 사용할 수있게 만들었으므로 프록시 측에 문제가 없습니다.

내 HTTPS 프록시에 대한 모든 요청을 암호화하는 HTTP 클라이언트를 작성하고 싶습니다. 나는이 방법을 DefaultHttpClient하기 위해 HTTPS 프록시 설정을 시도 -

DefaultHttpClient dhc = new DefaultHttpClient(); 
HttpHost proxy = new HttpHost("192.168.2.3", 8181, "https"); //NOTE : https 
dhc.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); 

그런 다음 모든 요청을 실행하려고하는 것은 나에게 SSLPeerUnverifiedException을 제공합니다. 나는 그 이유를 이해하지 못합니다.

DefaultHttpClient API를 탐색하는 동안 프록시에 대한 연결을 암호화해야하는지 여부를 지정할 수있는 HttpRoutePlanner와 HttpRoute를 보았습니다. 그러나, 나는이 일을 할 수 없다.

HTTP Client <------- Plain Text GET, POST Requests -------> HTTP Proxy <------- Plain Text GET, POST Requests -------> HTTP End-Site 

HTTP Client <------- Plain Text CONNECT Requests -------> HTTP Proxy <------- Plain Text CONNECT Requests -------> HTTPS End-Site 

참고 : HTTPS 최종 사이트의 경우 만 CONNECT 요청이

HTTP 프록시 - 여기

는 HTTP 프록시 설정으로 차별화하여 내 설정을 설명하는 도면이다 프록시가 본.

HTTP Client <------- Encrypted GET, POST Requests -------> HTTPS Proxy <-------- Plain Text GET, POST Requests --------> HTTP End-Site 

HTTP Client <------- Encrypted CONNECT Requests -------> HTTPS Proxy <------- Plain Text CONNECT Requests -------> HTTPS End-Site 

참고 : HTTPS 최종 사이트의 경우, 초기 CONNECT 요청이 프록시에 암호화되어야 그런 다음 SSL 터널은 클라이언트 및 최종 사이트

HTTPS 프록시 사이에 설정됩니다. 이후의 요청은 어쨌든 터널링됩니다.

누구든지이 목표를 달성 할 수있는 방법을 알려주십시오. HttpRoutePlanner가 도움이된다고 생각하지만, 어떻게해야할지 모르겠다. 감사.

답변

0

Apache HttpClient 4.x는 연결 터널링을 통해서만 프록시를 통해 SSL을 지원합니다. HTTPS 프록시는 지원하지 않습니다.

+0

안녕하세요 올렉. 작동하도록 만들었습니다. 내 대답을 참조하십시오. – MediumOne

+0

@mediumone 나를 믿어도 효과가 없습니다. https://issues.apache.org/jira/browse/HTTPCLIENT-1318 – oleg

+0

나를 위해 작동합니다. 포스터가 HTTP 최종 사이트가있을 때 직면했던 것과 동일한 오류가 발생했습니다. 오류는 다음과 같습니다 : ""route : plans = {} -> https : // localhost : 7777-> http : //www.exceptional.io; current = {s} -> https : // localhost : 7777->; http : //www.exceptional.io "'안전하게"True "로 자신의 RoutePlanner를 설정하여 보안 연결을 강제 할 수있었습니다. 이제 계획된 경로는'{s} -> https : // localhost : 7777-> http : //www.exceptional.io "'가되고 오류가 없습니다. – MediumOne

3

Apache HttpClient 4.x를 HTTPS 프록시와 함께 사용할 수있게 만들었습니다. 질문에서 언급 한 SSLPeerUnverifiedException이 프록시 서버의 인증서를 신뢰하지 않아서 발생했습니다. 일단 이것이 처리되면 HTTPS 최종 사이트에 대한 연결이 예상대로 작동합니다.

HTTP 최종 사이트에 연결하는 데는 자체 HttpRoutePlanner를 사용하여 작동하도록해야했습니다.

DefaultHttpClient dhc = new DefaultHttpClient(); 
HttpHost proxy = new HttpHost("192.168.2.3", 8181, "https"); 
dhc.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); 

SchemeSocketFactory factory = null; 
try { 
    factory = new SSLSocketFactory(new SimpleTrustStrategy()); //Trust All strategy 
} catch (GeneralSecurityException e1) { 
    e1.printStackTrace(); 
} 
Scheme https = new Scheme("https", 443, factory); 
dhc.getConnectionManager().getSchemeRegistry().register(https); 

HttpGet request = new HttpGet("http://en.wikipedia.org/wiki/Main_Page");  

try { 
    HttpHost host = determineTarget(request); 

    if(host.getSchemeName().equalsIgnoreCase("http")){ 
     dhc.setRoutePlanner(new MyRoutePlanner()); 
    } 

} catch (ClientProtocolException e1) { 
    e1.printStackTrace(); 
} 

MyRoutePlanner의 구현은 다음과 같습니다 - - 여기에 설명과 코드의

public class MyRoutePlanner implements HttpRoutePlanner { 
    @Override 
    public HttpRoute determineRoute(HttpHost target, HttpRequest request, 
      HttpContext context) throws HttpException { 
     return new HttpRoute(target, null 
       , new HttpHost("192.168.2.3", 8181, "https") 
       , true, TunnelType.PLAIN, LayerType.PLAIN); //Note: true 
    } 
} 

이 경로가 안전해야이 HTTPS 프록시를 통해 HTTP의 최종 사이트에 HttpClient를 이야기하려면 터널링이나 레이어링이 있어서는 안됩니다.

+0

HTTPS 프록시를 통한 HTTP에 대한 것 같습니다. , HTTPS를 통한 HTTPS가 아닙니다. 어쨌든 "모두 신뢰"전략을 사용하려면 "이중"SSL 계층을 사용하는 것이 무엇입니까? – Bruno

관련 문제