2012-03-24 5 views
7

Jetty의 ProxyServlet을 HTTP 프록시로 사용하고 있습니다.SSL을 지원하는 Jetty ProxyServlet

나는 서버를 시작하고 파이어 폭스에 양말 프록시를 추가 한 후 아무 문제없이 프록시를 통해 웹 사이트에 액세스 할 수 있습니다.

문제는 프록시를 통해 HTTPS 웹 사이트에 액세스하려고 할 때입니다. Firefox에서 "서버를 찾을 수 없음"오류가 표시되고 디버깅하는 동안 Java 코드에서 아무 것도 나타나지 않습니다.

여기 Jetty에 SSL 지원을 추가하기 위해 뭔가가 누락 되었습니까?

다음은 코드의 일부 :

Server httpProxy = new Server(8087); 

    ServletHandler servletHandler = new ServletHandler(); 
    servletHandler.addServletWithMapping(new ServletHolder(new TunnelProxyServlet()), "/*"); 

    httpProxy.setHandler(servletHandler); 
    try { 
     httpProxy.start(); 
    } catch (Exception ex) { 
     Logger.getLogger(HttpProxy.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    public class TunnelProxyServlet extends ProxyServlet { 
     @Override 
     public void init(ServletConfig config) throws ServletException { 
     super.init(config); 
     System.out.println("init done !"); 
     } 

     @Override 
     public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { 
     System.out.println("got a request !"); 
     super.service(req, res); 
     } 
    } 

답변

4

당신은 "ConnectHandler"를 사용할 수 있습니다

http://grepcode.com/file/repo1.maven.org/maven2/org.eclipse.jetty/example-jetty-embedded/8.1.1.v20120215/org/eclipse/jetty/embedded/ProxyServer.java

public class ProxyServer { 

    public static void main(String[] args) throws Exception { 

     Server server = new Server(); 
     SelectChannelConnector connector = new SelectChannelConnector(); 
     connector.setPort(8888); 
     server.addConnector(connector); 

     HandlerCollection handlers = new HandlerCollection(); 
     server.setHandler(handlers); 

     // Setup proxy servlet 
     ServletContextHandler context = new ServletContextHandler(handlers, "/", ServletContextHandler.SESSIONS); 
     ServletHolder proxyServlet = new ServletHolder(ProxyServlet.class); 
     proxyServlet.setInitParameter("whiteList", "google.com, www.eclipse.org, localhost"); 
     proxyServlet.setInitParameter("blackList", "google.com/calendar/*, www.eclipse.org/committers/"); 
     context.addServlet(proxyServlet, "/*"); 

     // Setup proxy handler to handle CONNECT methods 
     ConnectHandler proxy = new ConnectHandler(); 
     proxy.setWhite(new String[]{"mail.google.com"}); 
     proxy.addWhite("www.google.com"); 
     handlers.addHandler(proxy); 

     server.start(); 

    } 

} 
10

ZMK의 대답은 간단 부두 저장소에서 예제의 복사 및 수행 심지어 일하지 않아.

기본적으로 Jetty에는 HTTPS 프록시가 없습니다. AsyncProxyServlet 및 ProxyServlet 클래스는 HTTP 프록시 만 수행합니다. HTTPS 프록시를 수행하려면 다음을 수행하십시오.

  1. AsyncProxyServlet 클래스에서 확장되는 클래스를 작성하십시오.
  2. createHttpClient() 메소드를 재정의하십시오. 여기서 핵심은 생성 할 HttpClient 인스턴스에 SslContextFactory()가 필요하다는 것입니다. HttpClient 객체의 적절한 설정으로 SslContextFactory를 설정하기 만하면됩니다. 여기

코드 세부 예입니다 https://github.com/k2k2e6/jettyHttpsProxy

3

나는 부두의 최신 버전을 사용하고 현재 (9.4.1)와 나는 단순히이를 추가하여 HTTPS 프록시가 작동을 얻을 수있었습니다 내 프록시 서블릿 : 난 그냥 대신 전체 createHttpClient() 메소드의이 간단한 메소드를 오버라이드 (override) 할 수 실현하기 전에 시작 k2k2e6의 예에

@Override 
protected HttpClient newHttpClient() {   
    return new HttpClient(new SslContextFactory()); 
} 

신용.

+0

새 SslContextFactory()를 직접 전달하면 HttpClient 생성자가 적절한 xml 구성 파일 없이는 작동하지 않습니다. setTrustAll (true) 또는 새로운 SslContextFactory (true)를 사용하면 별도의 구성없이 작동합니다. 하지만 모든 인증서를 맹목적으로 신뢰할 수 있으므로 심각한 보안 결함입니다. –

관련 문제