Клиент Jetty http2 для игнорирования самозаверяющего сертификата

#java #ssl #jetty #http2

#java #ssl #jetty #http2

Вопрос:

У меня есть сервер http2 в https://ec2-52-57-54-142.eu-central-1.compute.amazonaws.com / с самоподписанным сертификатом. И у меня есть клиент jetty http2, который просто отправляет на него данные. По какой-то причине я не получаю игнорирование самозаверяющего сертификата для работы. Вот фрагмент соответствующего кода

 SslContextFactory factory = new SslContextFactory(true);
factory.setTrustAll(true);
factory.setValidateCerts(false);
factory.setValidatePeerCerts(false);
factory.setEndpointIdentificationAlgorithm(null);

SSLContext sslContext = factory.getSslContext();
if(null == sslContext) {
    sslContext = SSLContext.getInstance("TLS");
}
TrustManager[] verifiers = new TrustManager[] {...// some dummy trust manager that always passes};
sslContext.init(null, verifiers, null);
factory.setSslContext(sslContext);

HttpClientTransportOverHTTP2 httpClientTransportOverHTTP2
            = new HttpClientTransportOverHTTP2(new HTTP2Client());
HttpClient httpClient = new HttpClient(httpClientTransportOverHTTP2, factory);


Request request = httpClient.POST(destination);
ContentProvider contentProvider = new InputStreamContentProvider(new StringInputStream(payload));
request.content(contentProvider);
ContentResponse response = request.send();
  

И я получаю эти трассировки стека

 Caused by: java.util.concurrent.ExecutionException: java.nio.channels.ClosedChannelException
    at org.eclipse.jetty.client.util.FutureResponseListener.getResult(FutureResponseListener.java:118)
    at org.eclipse.jetty.client.util.FutureResponseListener.get(FutureResponseListener.java:101)
    at org.eclipse.jetty.client.HttpRequest.send(HttpRequest.java:652)
    at my code
    ... 34 more
Caused by: java.nio.channels.ClosedChannelException
    at org.eclipse.jetty.io.WriteFlusher.onClose(WriteFlusher.java:498)
    at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onIncompleteFlush(SslConnection.java:409)
    at org.eclipse.jetty.io.AbstractEndPoint$2.onIncompleteFlush(AbstractEndPoint.java:54)
    at org.eclipse.jetty.io.WriteFlusher.write(WriteFlusher.java:322)
    at org.eclipse.jetty.io.AbstractEndPoint.write(AbstractEndPoint.java:140)
    at org.eclipse.jetty.http2.HTTP2Flusher.process(HTTP2Flusher.java:243)
    at org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:241)
    at org.eclipse.jetty.util.IteratingCallback.succeeded(IteratingCallback.java:365)
    at org.eclipse.jetty.http2.HTTP2Flusher.succeeded(HTTP2Flusher.java:258)
    at org.eclipse.jetty.io.WriteFlusher$PendingState.complete(WriteFlusher.java:269)
    at org.eclipse.jetty.io.WriteFlusher.completeWrite(WriteFlusher.java:394)
    at org.eclipse.jetty.io.ssl.SslConnection$1.run(SslConnection.java:101)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)
    ... 1 more
  

Когда я выполняю действия с помощью отладчика, я вижу что-то о NOT_HANDSHAKE в одном из объектов connection.

Я действительно не забочусь о проверке чего-либо. Я просто хочу подключиться через HTTP2 / TLS. Я искал много разных терминов, но все они заканчиваются более или менее одним и тем же (setTrustAll, custom TrustManager и т. Д.)

Любая помощь? Спасибо!

PS Версия Jetty 9.3.12

Комментарии:

1.Вы настроили alpn-boot.jar версию, соответствующую вашей версии openjdk (на -Xbootclasspath )?

2. ДА. Тот же код работает с известным сервером http2 с сертификатом, одобренным центром сертификации

3. То есть другой сервер http2. И удаление всего мусора за попытку доверять всем

Ответ №1:

Ваш клиентский код правильный, хотя и избыточный. Достаточно сделать:

     SslContextFactory sslContextFactory = new SslContextFactory(true);

    HTTP2Client http2Client = new HTTP2Client();
    HttpClient httpClient = new HttpClient(new HttpClientTransportOverHTTP2(http2Client), sslContextFactory);
    httpClient.start();

    ContentResponse response = httpClient.GET("https://ec2-52-57-54-142.eu-central-1.compute.amazonaws.com/");
  

Если вы включите ведение журнала ОТЛАДКИ на клиенте Jetty HTTP / 2, вы увидите, что клиент получает:

 2016-10-05 09:20:33.102:DBUG:oejhp.Parser:qtp1897115967-15: Parsed GO_AWAY frame header from java.nio.HeapByteBuffer[pos=9 lim=35 cap=16384]
2016-10-05 09:20:33.103:DBUG:oejh.HTTP2Session:qtp1897115967-15: Received GoAwayFrame@3bc447d3,0/INADEQUATE_SECURITY_ERROR/Unknown error code
  

Итак, проблема в том, что сервер считает, что безопасность недостаточна (фрейм отправки поступает с кодом ошибки НЕАДЕКВАТНЫЙ_SECURITY_ERROR).

На данный момент проблема на сервере. Вы должны выяснить, почему сервер считает, что безопасность недостаточна. Вероятно, просто вопрос конфигурации на сервере.

Комментарии:

1. Пошел дальше и отправил запрос функции, чтобы сделать ошибку более понятной — github.com/eclipse/jetty.project/issues/980

Ответ №2:

Попробуйте

 transport.setUseALPN(false);
  

Комментарии:

1. Это практический ответ, который может быть полезен для этого вопроса, и я надеюсь, что они могут попытаться помочь им решить проблему, но я не знаю причину, если это ответ. Я надеюсь, что специалисты Jetty смогут дать объяснение, если захотят.