【问题标题】:Jetty ProxyServlet with SSL support支持 SSL 的 Jetty ProxyServlet
【发布时间】:2012-04-08 18:31:33
【问题描述】:

我正在使用 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);
      } 
   }

【问题讨论】:

    标签: ssl proxy jetty


    【解决方案1】:

    您可以使用“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】:

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

      Jetty 默认没有 HTTPS 代理。 AsyncProxyServlet 和 ProxyServlet 类只做 HTTP 代理。为了让您执行 HTTPS 代理,请执行以下操作:

      1. 创建一个从 AsyncProxyServlet 类扩展的类。
      2. 重写 createHttpClient() 方法。这里的关键是您将创建的 HttpClient 实例将需要一个 SslContextFactory()。只需在 HttpClient 对象上使用适当的设置设置 SslContextFactory 即可。

      这里是详细的代码示例: https://github.com/k2k2e6/jettyHttpsProxy

      【讨论】:

      • 我也遇到了类似的问题,对jetty的开发者给出的答案很失望,不知道你解决了吗?
      【解决方案3】:

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

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

      感谢 k2k2e6 的示例,在我意识到我可以重写这个简单的方法而不是整个 createHttpClient() 方法之前,我开始使用它。

      【讨论】:

      • 如果没有正确的 xml 配置文件,直接传递 new SslContextFactory() 信息将无法工作 HttpClient 构造函数。通过使用 setTrustAll(true) 或 new SslContextFactory(true) 无需任何额外配置即可工作。但是,这是一个重大的安全漏洞,因为它会盲目信任所有证书。
      • 您也可以在 SSLContextFactory 中添加信任库路径
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2014-11-26
      相关资源
      最近更新 更多