2012-03-24 12 views
7

Estoy utilizando Jetty ProxyServlet como proxy HTTP.Jetty ProxyServlet con compatibilidad SSL

Después de iniciar el servidor y agregar el proxy socks en firefox, puedo acceder a los sitios web a través del proxy sin ningún problema.

El problema es que cuando intento acceder a un sitio web HTTPs a través del proxy. Firefox muestra un error de "Servidor no encontrado" y durante la depuración no veo que ocurra nada en mi código de Java.

¿Echas en falta algo aquí para agregar soporte SSL a Jetty?

Aquí es parte del código:

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

Respuesta

4

Puede utilizar un "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

respuesta de Zmk es simplemente una copia del ejemplo de los repositorios del embarcadero y hace ni siquiera trabajo.

Jetty de forma predeterminada no tiene un proxy HTTPS. Las clases AsyncProxyServlet y ProxyServlet solo hacen proxy HTTP. Para que pueda hacer un proxy HTTPS, haga lo siguiente:

  1. Cree una clase que se extienda desde la clase AsyncProxyServlet.
  2. Anula el método createHttpClient(). La clave aquí es que la instancia HttpClient que creará necesitará una SslContextFactory(). Simplemente configure SslContextFactory con la configuración adecuada en el objeto HttpClient y estará listo para continuar.

Aquí está el ejemplo de código en detalle: https://github.com/k2k2e6/jettyHttpsProxy

3

estoy usando la última versión del embarcadero en la actualidad (9.4.1) y yo era capaz de conseguir proxy HTTPS trabajar con sólo añadir esto a mi Proxy Servlet:

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

crédito al ejemplo de k2k2e6 la que empecé con antes de darse cuenta tan sólo pudiera invalidar este sencillo método en lugar del método completo createHttpClient().

+0

Pasando nueva SslContextFactory() información directa el constructor HttpClient no funcionará sin los archivos de configuración xml correctos. Al usar setTrustAll (verdadero) o nuevo SslContextFactory (verdadero) funcionará sin ninguna configuración adicional. PERO es una gran falla de seguridad ya que confiará ciegamente en todos los certificados. –