2012-03-24 20 views
7

Używam ProxyServlet Jetty jako proxy HTTP.Jetty ProxyServlet z obsługą SSL

Po uruchomieniu serwera i dodaniu skarpetki proxy w firefox, mogę bez problemu uzyskać dostęp do stron internetowych za pośrednictwem serwera proxy.

Problem polega na tym, że próbuję uzyskać dostęp do witryny HTTPs za pośrednictwem serwera proxy. Firefox wyświetla błąd "Nie znaleziono serwera", a podczas debugowania nic nie dzieje się w moim kodzie Java.

Czy brakuje mi tutaj czegoś, aby dodać obsługę SSL do Jetty?

Oto część kodu:

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); 
     } 
    } 

Odpowiedz

4

Można użyć "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

odpowiedź ZMK jest po prostu kopią przykład z repozytoriów Jetty i robi nawet nie działa.

Molo domyślnie nie ma serwera proxy HTTPS. Klasy AsyncProxyServlet i ProxyServlet obsługują tylko serwer proxy HTTP. Aby wykonać proxy HTTPS, wykonaj następujące czynności:

  1. Utwórz klasę, która rozciąga się od klasy AsyncProxyServlet.
  2. Zastąpić metodę createHttpClient(). Kluczowe jest to, że utworzona instancja HttpClient będzie wymagać SslContextFactory(). Po prostu ustaw SslContextFactory z odpowiednimi ustawieniami na obiekcie HttpClient, a będziesz gotowy.

Oto przykład kodu w szczegółach: https://github.com/k2k2e6/jettyHttpsProxy

3

Używam najnowszej wersji Jetty obecnie (9.4.1) i udało mi się dostać pracę HTTPS proxy po prostu dodając to do mojego proxy Servlet:

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

Credit przykładu k2k2e6, które zacząłem przed realizacji może po prostu zastąpić tę prostą metodę zamiast metody cała createHttpClient().

+0

Przekazanie nowego SslContextFactory() bezpośrednio informacji konstruktora HttpClient nie będzie działać bez odpowiednich plików konfiguracyjnych xml. Użycie setTrustAll (true) lub new SslContextFactory (true) zadziała bez dodatkowej konfiguracji. ALE, jest to poważna luka w zabezpieczeniach, ponieważ będzie ślepo ufać wszystkim certyfikatom. –