2012-03-24 99 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