Jetty ProxyServlet с поддержкой SSL - PullRequest
8 голосов
/ 24 марта 2012

Я использую Jetty ProxyServlet в качестве HTTP-прокси.

После того, как я запустил сервер и добавил прокси socks в firefox, я могу без проблем получать доступ к веб-сайтам через прокси.

Проблема в том, что когда я пытаюсь получить доступ к веб-сайту HTTP через прокси. 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);
      } 
   }

Ответы [ 3 ]

10 голосов
/ 30 января 2015

Ответ ZmK является просто копией примера из репозиториев Jetty и даже не работает.

Jetty по умолчанию не имеет HTTPS-прокси.Классы AsyncProxyServlet и ProxyServlet используют только HTTP-прокси.Чтобы вы могли использовать HTTPS-прокси, выполните следующие действия:

  1. Создайте класс, расширяемый из класса AsyncProxyServlet.
  2. Переопределите метод createHttpClient ().Ключевым моментом здесь является то, что экземпляру HttpClient, который вы создадите, потребуется SslContextFactory ().Просто установите SslContextFactory с соответствующими настройками для объекта HttpClient, и все будет хорошо.

Подробно приведен пример кода: https://github.com/k2k2e6/jettyHttpsProxy

4 голосов
/ 27 января 2017

Я использую последнюю версию Jetty в настоящее время (9.4.1), и мне удалось заставить HTTPS-прокси работать, просто добавив это в мой прокси-сервлет:

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

Кредит к примеру k2k2e6Я начал с того, что понял, что могу переопределить этот простой метод вместо всего метода createHttpClient ().

4 голосов
/ 09 мая 2012

Вы можете использовать «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();

    }

}
...