Jetty ProxyServlet с поддержкой SSL
Я использую 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 ответа
Вы можете использовать "ConnectHandler"
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();
}
}
Ответ ZmK - просто копия примера из репозиториев Jetty и даже не работает.
Jetty по умолчанию не имеет HTTPS Proxy. Классы AsyncProxyServlet и ProxyServlet используют только HTTP-прокси. Чтобы сделать HTTPS-прокси, сделайте следующее:
- Создайте класс, который выходит из класса AsyncProxyServlet.
- Переопределите метод createHttpClient(). Ключевым моментом здесь является то, что для экземпляра HttpClient, который вы создадите, потребуется SslContextFactory(). Просто установите SslContextFactory с соответствующими настройками объекта HttpClient, и все будет хорошо.
Вот пример кода подробно: https://github.com/k2k2e6/jettyHttpsProxy
Я использую последнюю версию Jetty в настоящее время (9.4.1), и я смог заставить HTTPS-прокси работать, просто добавив это в мой Proxy Servlet:
@Override
protected HttpClient newHttpClient() {
return new HttpClient(new SslContextFactory());
}
Благодарю пример k2k2e6, с которого я начал, прежде чем понял, что могу просто переопределить этот простой метод вместо всего метода createHttpClient().