2012-03-24 122 views
7

我使用Jetty的ProxyServlet作爲HTTP代理。帶SSL支持的Jetty ProxyServlet

當我啓動服務器並在Firefox中添加襪子代理後,我可以通過代理訪問網站,沒有任何問題。

問題是,當我嘗試通過代理訪問HTTPs網站時。 Firefox顯示「未找到服務器」錯誤,在調試過程中,我沒有看到Java代碼中發生任何事情。

我錯過了什麼在這裏添加SSL支持Jetty?

下面是部分代碼:

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

克瓦查的答案是簡單地從碼頭倉庫的例子中的副本和做甚至沒有工作。

Jetty默認沒有HTTPS代理。 AsyncProxyServlet和ProxyServlet類只能執行HTTP代理。爲了讓您執行HTTPS代理,請執行以下操作:

  1. 創建一個從AsyncProxyServlet類繼承的類。
  2. 重寫createHttpClient()方法。這裏的關鍵是你要創建的HttpClient實例需要一個SslContextFactory()。只需在HttpClient對象上使用適當的設置來設置SslContextFactory,你就會很好。

下面是詳細的代碼示例:目前(9.4.1) https://github.com/k2k2e6/jettyHttpsProxy

3

我使用碼頭的最新版本,我能夠通過簡單地添加這讓HTTPS代理我的工作代理Servlet:

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

感謝k2k2e6的例子,我意識到我可以覆蓋這個簡單的方法,而不是整個createHttpClient()方法之前開始。

+0

直接傳遞新的SslContextFactory()如果​​沒有正確的xml配置文件,HttpClient構造函數將無法工作。通過使用setTrustAll(true)或新的SslContextFactory(true)可以在沒有任何額外配置的情況下工作。但是,這是一個重大的安全漏洞,因爲它會盲目地信任所有的證書。 – 2017-04-21 19:35:30