Я искал, как реализовать Conscrypt SSL-провайдера, использующего concerypt-openjdk-uber-1.4.1.jar для jdk8 для поддержки ALPN для создания http2 (с использованием apache httpclient 5) подключение к серверу, так как jdk8 не поддерживает ALPN по умолчанию , или другое решение - перейти на jdk9 (или выше), что невозможно для теперь, поскольку наш продукт сильно зависит от jdk8
Я много искал документы или примеры для реализации, но не смог найти.
Я попытался вставить поставщика по умолчанию, и моя программа использует его как поставщика по умолчанию, но все равно не удается подключиться к серверу http2, мой пример следующий:
public static void main(final String[] args) throws Exception {
Security.insertProviderAt(new OpenSSLProvider(), 1);
final SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(new TrustAllStrategy()).build();
final PoolingAsyncClientConnectionManager connectionManager = PoolingAsyncClientConnectionManagerBuilder.create().setTlsStrategy(new H2TlsStrategy(sslContext, NoopHostnameVerifier.INSTANCE)).build();
final IOReactorConfig ioReactorConfig = IOReactorConfig.custom().setSoTimeout(Timeout.ofSeconds(5)).build();
final MinimalHttpAsyncClient client = HttpAsyncClients.createMinimal(HttpVersionPolicy.FORCE_HTTP_2, H2Config.DEFAULT, null, ioReactorConfig, connectionManager);
client.start();
final HttpHost target = new HttpHost("localhost", 8082, "https");
final Future<AsyncClientEndpoint> leaseFuture = client.lease(target, null);
final AsyncClientEndpoint endpoint = leaseFuture.get(10, TimeUnit.SECONDS);
try {
String[] requestUris = new String[] {"/"};
CountDownLatch latch = new CountDownLatch(requestUris.length);
for (final String requestUri: requestUris) {
SimpleHttpRequest request = SimpleHttpRequest.get(target, requestUri);
endpoint.execute(SimpleRequestProducer.create(request), SimpleResponseConsumer.create(), new FutureCallback<SimpleHttpResponse>() {
@Override
public void completed(final SimpleHttpResponse response) {
latch.countDown();
System.out.println(requestUri + "->" + response.getCode());
System.out.println(response.getBody());
}
@Override
public void failed(final Exception ex) {
latch.countDown();
System.out.println(requestUri + "->" + ex);
ex.printStackTrace();
}
@Override
public void cancelled() {
latch.countDown();
System.out.println(requestUri + " cancelled");
}
});
}
latch.await();
} catch (Exception e) {
e.printStackTrace();
}finally {
endpoint.releaseAndReuse();
}
client.shutdown(ShutdownType.GRACEFUL);
}
эта программа выводит как
org.apache.hc.core5.http.ConnectionClosedException: соединение закрыто
org.apache.hc.core5.http.ConnectionClosedException: соединение закрыто
в org.apache.hc.core5.http2.impl.nio.FrameInputBuffer.read (FrameInputBuffer.java:146)
в org.apache.hc.core5.http2.impl.nio.AbstractHttp2StreamMultiplexer.onInput (AbstractHttp2StreamMultiplexer.java:415)
at org.apache.hc.core5.http2.impl.nio.AbstractHttp2IOEventHandler.inputReady (AbstractHttp2IOEventHandler.java:63)
в org.apache.hc.core5.http2.impl.nio.ClientHttp2IOEventHandler.inputReady (ClientHttp2IOEventHandler.java:38)
в org.apache.hc.core5.reactor.InternalDataChannel.onIOEvent (InternalDataChannel.java:117)
в org.apache.hc.core5.reactor.InternalChannel.handleIOEvent (InternalChannel.java:50)
в org.apache.hc.core5.reactor.SingleCoreIOReactor.processEvents (SingleCoreIOReactor.java:173)
в org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute (SingleCoreIOReactor.java:123)
at org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute (AbstractSingleCoreIOReactor.java:80)
на org.apache.hc.core5.reactor.IOReactorWorker.run (IOReactorWorker.java:44)
at java.lang.Thread.run (Thread.java:748)
Если я печатаю провайдера и версию, он печатает как Conscrypt version 1.0 и JDK 1.8.0_162 , но все равно не удается подключиться к конечной точке http2
тот же кусок кода работает отлично, если я подключаюсь с помощью jdk9 с провайдером по умолчанию, чего мне здесь не хватает в конфигурации concerypt?
Любая помощь приветствуется
Заранее спасибо