支持SSL的Jetty ProxyServlet

时间:2012-03-24 13:16:13

标签: ssl proxy jetty

我使用Jetty的ProxyServlet作为HTTP代理。

启动服务器并在firefox中添加socks代理后,我可以通过代理访问网站,没有任何问题。

问题在于,当我尝试通过代理访问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);
      } 
   }

3 个答案:

答案 0 :(得分:10)

ZmK的回答只是Jetty存储库中的示例副本,甚至不起作用。

Jetty默认情况下没有HTTPS代理。 AsyncProxyServlet和ProxyServlet类仅执行HTTP代理。要使用HTTPS代理,请执行以下操作:

  1. 创建一个从AsyncProxyServlet类扩展的类。
  2. 覆盖createHttpClient()方法。这里的关键是你要创建的HttpClient实例需要一个SslContextFactory()。只需在HttpClient对象上使用适当的设置设置SslContextFactory,就可以了。
  3. 以下是详细的代码示例: https://github.com/k2k2e6/jettyHttpsProxy

答案 1 :(得分: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();

    }

}

答案 2 :(得分:4)

我目前正在使用Jetty的最新版本(9.4.1),我只需将其添加到我的代理服务器Servlet就可以使HTTPS代理工作:

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

归功于k2k2e6的例子,我在开始之前意识到我可以覆盖这个简单的方法而不是整个createHttpClient()方法。