You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by co...@apache.org on 2018/07/05 15:31:20 UTC

[cxf] branch master updated: CXF-7782 - Client session context is null before SSL context initialization

This is an automated email from the ASF dual-hosted git repository.

coheigea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/master by this push:
     new 4d3db73  CXF-7782 - Client session context is null before SSL context initialization
4d3db73 is described below

commit 4d3db73226e7cc6241616be4e7979d3c3357c350
Author: Colm O hEigeartaigh <co...@apache.org>
AuthorDate: Thu Jul 5 15:45:16 2018 +0100

    CXF-7782 - Client session context is null before SSL context initialization
---
 .../org/apache/cxf/transport/https/SSLUtils.java   |  8 ++--
 systests/transports/pom.xml                        |  6 +++
 .../systest/https/clientauth/ClientAuthTest.java   | 52 ++++++++++++++++++++++
 3 files changed, 62 insertions(+), 4 deletions(-)

diff --git a/rt/transports/http/src/main/java/org/apache/cxf/transport/https/SSLUtils.java b/rt/transports/http/src/main/java/org/apache/cxf/transport/https/SSLUtils.java
index e11eea2..49242ac 100644
--- a/rt/transports/http/src/main/java/org/apache/cxf/transport/https/SSLUtils.java
+++ b/rt/transports/http/src/main/java/org/apache/cxf/transport/https/SSLUtils.java
@@ -70,10 +70,6 @@ public final class SSLUtils {
         SSLContext ctx = provider == null ? SSLContext.getInstance(protocol) : SSLContext
             .getInstance(protocol, provider);
 
-        if (parameters instanceof TLSClientParameters) {
-            ctx.getClientSessionContext().setSessionTimeout(((TLSClientParameters)parameters).getSslCacheTimeout());
-        }
-
         KeyManager[] keyManagers = parameters.getKeyManagers();
         if (keyManagers == null && parameters instanceof TLSClientParameters) {
             keyManagers = org.apache.cxf.configuration.jsse.SSLUtils.getDefaultKeyStoreManagers(LOG);
@@ -87,6 +83,10 @@ public final class SSLUtils {
 
         ctx.init(configuredKeyManagers, trustManagers, parameters.getSecureRandom());
 
+        if (parameters instanceof TLSClientParameters && ctx.getClientSessionContext() != null) {
+            ctx.getClientSessionContext().setSessionTimeout(((TLSClientParameters)parameters).getSslCacheTimeout());
+        }
+
         return ctx;
     }
 
diff --git a/systests/transports/pom.xml b/systests/transports/pom.xml
index e348f75..8c3b53e 100644
--- a/systests/transports/pom.xml
+++ b/systests/transports/pom.xml
@@ -264,6 +264,12 @@
             <groupId>org.littleshoot</groupId>
             <artifactId>littleproxy</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bctls-jdk15on</artifactId>
+            <version>${cxf.bcprov.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
     <profiles>
         <profile>
diff --git a/systests/transports/src/test/java/org/apache/cxf/systest/https/clientauth/ClientAuthTest.java b/systests/transports/src/test/java/org/apache/cxf/systest/https/clientauth/ClientAuthTest.java
index 92fc9ff..0160a69 100644
--- a/systests/transports/src/test/java/org/apache/cxf/systest/https/clientauth/ClientAuthTest.java
+++ b/systests/transports/src/test/java/org/apache/cxf/systest/https/clientauth/ClientAuthTest.java
@@ -22,6 +22,7 @@ package org.apache.cxf.systest.https.clientauth;
 import java.io.InputStream;
 import java.net.URL;
 import java.security.KeyStore;
+import java.security.Security;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
 
@@ -46,6 +47,8 @@ import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
 import org.apache.cxf.transport.http.HTTPConduit;
 import org.apache.hello_world.Greeter;
 import org.apache.hello_world.services.SOAPService;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider;
 
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -360,6 +363,55 @@ public class ClientAuthTest extends AbstractBusClientServerTestBase {
         ((java.io.Closeable)port).close();
     }
 
+    // See CXF-7782
+    @org.junit.Test
+    public void testBouncyCastleProvider() throws Exception {
+        try {
+            Security.addProvider(new BouncyCastleProvider());
+            Security.addProvider(new BouncyCastleJsseProvider());
+            URL url = SOAPService.WSDL_LOCATION;
+            SOAPService service = new SOAPService(url, SOAPService.SERVICE);
+            assertNotNull("Service is null", service);
+
+            // Set up (shared) KeyManagers/TrustManagers
+            X509TrustManager trustManager = new NoOpX509TrustManager();
+            TrustManager[] trustManagers = new TrustManager[1];
+            trustManagers[0] = trustManager;
+
+            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+
+            try (InputStream inputStream = ClassLoaderUtils.getResourceAsStream("keymanagers.jks", this.getClass())) {
+                KeyStore keyStore = KeyStore.getInstance("JKS");
+                keyStore.load(inputStream, "password".toCharArray());
+
+                kmf.init(keyStore, "password".toCharArray());
+            }
+            KeyManager[] keyManagers = kmf.getKeyManagers();
+
+            // First call to PORT using Morpit
+            TLSClientParameters tlsParams = new TLSClientParameters();
+            tlsParams.setJsseProvider(new BouncyCastleJsseProvider().getName());
+            tlsParams.setKeyManagers(keyManagers);
+            tlsParams.setCertAlias("morpit");
+            tlsParams.setTrustManagers(trustManagers);
+            tlsParams.setDisableCNCheck(true);
+
+            Greeter port = service.getHttpsPort();
+            assertNotNull("Port is null", port);
+
+            updateAddressPort(port, PORT);
+            Client client = ClientProxy.getClient(port);
+            HTTPConduit http = (HTTPConduit) client.getConduit();
+            http.setTlsClientParameters(tlsParams);
+
+            assertEquals(port.greetMe("Kitty"), "Hello Kitty");
+            ((java.io.Closeable)port).close();
+        } finally {
+            Security.removeProvider(new BouncyCastleJsseProvider().getName());
+            Security.removeProvider(new BouncyCastleProvider().getName());
+        }
+    }
+
     private static final class DisableCNCheckVerifier implements HostnameVerifier {
 
         @Override