Как обработать запрос на соединение для SSL с Jetty ProxyServlet - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь написать прокси-сервер, используя встроенный Jetty (9.4.9.v20180320). В идеале мы хотим использовать AsyncMiddlemanServlet, чтобы мы могли перехватывать контент и дополнять / заменять его, прежде чем он будет возвращен клиенту. Как это часто бывает, он работает нормально с HTTP, но я не могу добиться успеха с HTTPS.

Это прокси-сервер, который используется внутри, чтобы добавить некоторые возможности к старому серверному продукту, который обращается к внутреннему содержимому, размещенному на HTTPS. Мне нужно, чтобы серверный элемент диалога выполнял необходимый HTTPS-диалог для получения контента (что я могу сделать в простом «обычном» сервлете с использованием apache HttpClient), и мне нужно, чтобы прокси-сторона также управляла CONNECT. запрос, как это то, что мы получаем, когда старый серверный продукт запрашивает содержимое HTTPS. Конечно, в этом случае есть два разных SSL-соединения: старый серверный продукт с нашим прокси-сервером и наш прокси-сервер с контентом.

Из многих прочитанных видно, что проблема в том, что сервлеты не реализуют возможность отвечать на запрос CONNECT. Я пробовал много разных примеров, включая переопределение newHttpClient, например:

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

, а также реализация createHttpClient согласно « Jetty ProxyServlet с поддержкой SSL », но безрезультатно.

Самая близкая вещь, которую я нашел, это добавить connectHandler следующим образом (используя простой proxyServlet):

    public static void main( String[] args )
    {
        Server server = new Server();
        ServerConnector connector = new ServerConnector(server);
        connector.setPort(10106);
        server.addConnector(connector);

        // Setup  handler to handle CONNECT methods
        ConnectHandler proxy = new ConnectHandler();
        server.setHandler(proxy);

        // Setup proxy servlet
        ServletContextHandler context = new ServletContextHandler(proxy,      
         "/",ServletContextHandler.SESSIONS);

        myProxyServlet mps = new myProxyServlet();
        context.addServlet(new ServletHolder(mps), "/*");

        try{
            server.start();
        }   catch(Exception e){
            System.out.println("oh dear ;-) " + e.getMessage());
        }
    }

Это своего рода работает в том смысле, что использование curl для вызова прокси-запроса на содержимое https возвращает содержимое, но оно не идет рядом с моим proxyServlet (или моим обычным сервлетом, когда я использую его вместо этого).

мы тестируем с curl следующим образом:

curl --insecure -x localhost:10106  /6337288/jetty-proxyservlet-s-podderzhkoi-ssl_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

Есть ли способ использовать ConnectHandler с моим сервлетом? Или простой простой сервлет, или, что лучше всего, AsyncMiddlemanServlet? Или есть лучший способ добиться того, что я пытаюсь сделать?

...