Quantcast
Channel: Active questions tagged https - Stack Overflow
Viewing all articles
Browse latest Browse all 1854

Apache HttpClient - SSL failures

$
0
0

I'm trying to connect to an endpoint using Apache's HttpClient 4.5, and am running into the below exception:

DEBUG [main] (RequestAddCookies) - CookieSpec selected: defaultDEBUG [main] (RequestAuthCache) - Auth cache not set in the contextDEBUG [main] (PoolingHttpClientConnectionManager) - Connection request: [route: {s}->https://my-rest-endpoint:443][total available: 0; route allocated: 0 of 12; total allocated: 0 of 12]DEBUG [main] (PoolingHttpClientConnectionManager) - Connection leased: [id: 0][route: {s}->https://my-rest-endpoint:443][total available: 0; route allocated: 1 of 12; total allocated: 1 of 12]DEBUG [main] (MainClientExec) - Opening connection {s}->https://my-rest-endpoint:443DEBUG [main] (DefaultHttpClientConnectionOperator) - Connecting to my-rest-endpoint/<endpoint-ip-address>:443DEBUG [main] (SSLConnectionSocketFactory) - Connecting socket to my-rest-endpoint/<endpoint-ip-address>:443 with timeout 0DEBUG [main] (SSLConnectionSocketFactory) - Enabled protocols: [TLSv1.1, TLSv1.2, TLSv1.3]DEBUG [main] (SSLConnectionSocketFactory) - Enabled cipher suites:[TLS_AES_256_GCM_SHA384, TLS_AES_128_GCM_SHA256, TLS_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]DEBUG [main] (SSLConnectionSocketFactory) - Starting handshakeDEBUG [main] (DefaultManagedHttpClientConnection) - http-outgoing-0: Shutdown connectionDEBUG [main] (MainClientExec) - Connection discardedDEBUG [main] (PoolingHttpClientConnectionManager) - Connection released: [id: 0][route: {s}->https://my-rest-endpoint:443][total available: 0; route allocated: 0 of 12; total allocated: 0 of 12]INFO  [main] (RetryExec) - I/O exception (java.net.SocketException) caught when processing request to {s}->https://my-rest-endpoint:443: Connection resetDEBUG [main] (RetryExec) - Connection resetjava.net.SocketException: Connection reset    at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:328)    at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:355)    at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:808)    at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)    at java.base/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:484)    at java.base/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:478)    at java.base/sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:160)    at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:111)    at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1506)    at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1421)    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:455)    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:426)    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:436)    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:384)    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)    at com.my.package.rest.MyRestClientImpl.executePostRequest(MyRestClientImpl.java:84)    at com.my.package.client.MyRestClientTest.test(MyRestClientTest.java:109)    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.base/java.lang.reflect.Method.invoke(Method.java:568)    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:728)    at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)    at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:156)    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:147)    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86)    at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103)    at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93)    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)    at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:92)    at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:86)    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:218)    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:214)    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:139)    at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)    at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)    at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)    at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)    at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)    at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)    at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198)    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169)    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93)    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58)    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141)    at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57)    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)    at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)    at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)    at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:63)    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)    at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)    at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)

Here's how the client is configured:

var httpClientBuilder = HttpClientBuilder.create()        .setMaxConnTotal(clientConfig.maxConnectionsTotal())        .setMaxConnPerRoute(clientConfig.maxConnectionsPerRoute())        .setConnectionTimeToLive(clientConfig.connectionLifetime(), clientConfig.connectionLifetimeUnit());final SSLContext sslContext = SSLContexts.custom()        .setTrustManagerFactoryAlgorithm("PKIX")        .setKeyManagerFactoryAlgorithm("PKIX")        .setKeyStoreType("PKCS12")        .setProtocol("TLSv1.2")        .loadKeyMaterial(keyStoreLocation.toFile(), keyStorePassphrase, privateKeyPassphrase)        .loadTrustMaterial(trustStoreLocation.toFile(), trustStorePassphrase)        .build();httpClientBuilder.setSSLContext(sslContext);httpClientBuilder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE);final CloseableHttpClient client = httpClientBuilder.build();try {    final HttpPost request = new HttpPost(endpoint);    Map<String, String> customHeaders = Map.of(HttpHeaders.ACCEPT, "application/json",     HttpHeaders.CONTENT_TYPE, "application/json;charset=utf-8");    customHeaders.forEach(request::addHeader);    HttpEntity entity = new StringEntity(jsonString, ContentType.APPLICATION_JSON);    request.setEntity(entity);    HttpResponse response = client.execute(request, httpContextThreadLocal.get());// Do stuff with the response...} catch (URISyntaxException e) {    throw new IOException("Invalid URI request", e);}

What's perplexing me is that using the built-in Java (17) HttpClient with the same configuration, everything works.

// Configuration for the Java HttpClientclientStore = KeyStore.getInstance("PKCS12");clientStore.load(keyStoreLocation, keyStorePassword.toCharArray());KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("PKIX");keyManagerFactory.init(clientStore, keyStorePassword.toCharArray());KeyManager[] keyManagers = keyManagerFactory.getKeyManagers();trustStore = KeyStore.getInstance("PKCS12");trustStore.load(trustStoreLocation, trustStorePassword.toCharArray());TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("PKIX");trustManagerFactory.init(trustStore);TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();SSLContext sslContext = null;sslContext = SSLContext.getInstance("TLS");sslContext.init(keyManagers, trustManagers, new SecureRandom());HttpClient client = HttpClient.newBuilder().sslContext(sslContext).build();

I'm sure I'm just missing one small configuration option or the like for the Apache client, but I can't figure out what it's doing differently under the hood that's causing the issue, and I can't spot a difference between the requests that the two clients are sending. Is there some obvious configuration option that I'm missing? Thanks in advance.


Viewing all articles
Browse latest Browse all 1854

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>