You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2021/08/20 17:48:08 UTC

[tomcat] 02/03: Refactor SSL tests to test both JSSE and OpenSSL implementations

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

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit 5c1b14a9e34bd965146c4941742ff6221a5110c8
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed Aug 18 21:12:50 2021 +0100

    Refactor SSL tests to test both JSSE and OpenSSL implementations
---
 .../catalina/valves/rewrite/TestResolverSSL.java   |  42 ++++++-
 test/org/apache/coyote/http2/TestHttp2Limits.java  |   2 +-
 test/org/apache/coyote/http2/TestLargeUpload.java  |  48 ++++++++
 .../org/apache/tomcat/util/net/TestClientCert.java |  40 +++++++
 .../tomcat/util/net/TestClientCertTls13.java       |  52 ++++++++-
 .../tomcat/util/net/TestCustomSslTrustManager.java |  39 +++++++
 .../tomcat/util/net/TestSSLHostConfigCompat.java   |  30 +++--
 .../util/net/TestSSLHostConfigIntegration.java     |  39 +++++++
 test/org/apache/tomcat/util/net/TestSsl.java       |  84 +++++++++++--
 test/org/apache/tomcat/util/net/TesterSupport.java |  46 +-------
 .../tomcat/util/net/openssl/TestOpenSSLConf.java   |  45 +++----
 .../websocket/TestWebSocketFrameClientSSL.java     |  54 ++++++++-
 .../tomcat/websocket/TestWsWebSocketContainer.java |  42 -------
 .../websocket/TestWsWebSocketContainerSSL.java     | 130 +++++++++++++++++++++
 14 files changed, 551 insertions(+), 142 deletions(-)

diff --git a/test/org/apache/catalina/valves/rewrite/TestResolverSSL.java b/test/org/apache/catalina/valves/rewrite/TestResolverSSL.java
index c1bede6..e426dac 100644
--- a/test/org/apache/catalina/valves/rewrite/TestResolverSSL.java
+++ b/test/org/apache/catalina/valves/rewrite/TestResolverSSL.java
@@ -18,15 +18,24 @@ package org.apache.catalina.valves.rewrite;
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 
 import jakarta.servlet.ServletException;
 
 import org.junit.Assert;
+import org.junit.Assume;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
 
 import org.apache.catalina.Container;
 import org.apache.catalina.connector.Request;
 import org.apache.catalina.connector.Response;
+import org.apache.catalina.core.AprLifecycleListener;
+import org.apache.catalina.core.StandardServer;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.catalina.valves.ValveBase;
@@ -34,15 +43,37 @@ import org.apache.tomcat.util.buf.ByteChunk;
 import org.apache.tomcat.util.net.SSLHostConfig;
 import org.apache.tomcat.util.net.TesterSupport;
 
+@RunWith(Parameterized.class)
 public class TestResolverSSL extends TomcatBaseTest {
 
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> parameters() {
+        List<Object[]> parameterSets = new ArrayList<>();
+        parameterSets.add(new Object[] {
+                "JSSE", Boolean.FALSE, "org.apache.tomcat.util.net.jsse.JSSEImplementation"});
+        parameterSets.add(new Object[] {
+                "OpenSSL", Boolean.TRUE, "org.apache.tomcat.util.net.openssl.OpenSSLImplementation"});
+
+        return parameterSets;
+    }
+
+    @Parameter(0)
+    public String connectorName;
+
+    @Parameter(1)
+    public boolean needApr;
+
+    @Parameter(2)
+    public String sslImplementationName;
+
+
     @Test
     public void testSslEnv() throws Exception {
         Tomcat tomcat = getTomcatInstance();
         Container root = tomcat.getHost().findChild("");
         root.getPipeline().addValve(new ResolverTestValve());
 
-        // Enable session caching so the SSL Session is available when using APR
+        // Enable session caching so the SSL Session is available when using OpenSSL
         SSLHostConfig sslHostConfig = tomcat.getConnector().findSslHostConfigs()[0];
         sslHostConfig.setSessionCacheSize(20 * 1024);
 
@@ -138,5 +169,14 @@ public class TestResolverSSL extends TomcatBaseTest {
         TesterSupport.configureClientCertContext(tomcat);
 
         TesterSupport.configureClientSsl();
+
+        Assert.assertTrue(tomcat.getConnector().setProperty("sslImplementationName", sslImplementationName));
+
+        if (needApr) {
+            AprLifecycleListener listener = new AprLifecycleListener();
+            Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+            StandardServer server = (StandardServer) tomcat.getServer();
+            server.addLifecycleListener(listener);
+        }
     }
 }
diff --git a/test/org/apache/coyote/http2/TestHttp2Limits.java b/test/org/apache/coyote/http2/TestHttp2Limits.java
index bd7578c..2cc7792 100644
--- a/test/org/apache/coyote/http2/TestHttp2Limits.java
+++ b/test/org/apache/coyote/http2/TestHttp2Limits.java
@@ -42,7 +42,7 @@ public class TestHttp2Limits extends Http2TestBase {
 
     @Test
     public void testSettingsOverheadLimits() throws Exception {
-        http2Connect(false);
+        http2Connect();
 
         for (int i = 0; i < 100; i++) {
             try {
diff --git a/test/org/apache/coyote/http2/TestLargeUpload.java b/test/org/apache/coyote/http2/TestLargeUpload.java
index 5049293..ea067d8 100644
--- a/test/org/apache/coyote/http2/TestLargeUpload.java
+++ b/test/org/apache/coyote/http2/TestLargeUpload.java
@@ -20,6 +20,9 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
 
 import jakarta.servlet.ServletException;
@@ -27,15 +30,43 @@ import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 
 import org.junit.Assert;
+import org.junit.Assume;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
 
 import org.apache.catalina.Context;
 import org.apache.catalina.LifecycleException;
+import org.apache.catalina.core.AprLifecycleListener;
+import org.apache.catalina.core.StandardServer;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.coyote.http11.AbstractHttp11Protocol;
 
+@RunWith(Parameterized.class)
 public class TestLargeUpload extends Http2TestBase {
 
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> parameters() {
+        List<Object[]> parameterSets = new ArrayList<>();
+        parameterSets.add(new Object[] {
+                "JSSE", Boolean.FALSE, "org.apache.tomcat.util.net.jsse.JSSEImplementation"});
+        parameterSets.add(new Object[] {
+                "OpenSSL", Boolean.TRUE, "org.apache.tomcat.util.net.openssl.OpenSSLImplementation"});
+
+        return parameterSets;
+    }
+
+    @Parameter(0)
+    public String connectorName;
+
+    @Parameter(1)
+    public boolean needApr;
+
+    @Parameter(2)
+    public String sslImplementationName;
+
+
     int bodySize = 13107;
     int bodyCount = 5;
 
@@ -115,4 +146,21 @@ public class TestLargeUpload extends Http2TestBase {
             }
         }
     }
+
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        Tomcat tomcat = getTomcatInstance();
+
+        Assert.assertTrue(tomcat.getConnector().setProperty("sslImplementationName", sslImplementationName));
+
+        if (needApr) {
+            AprLifecycleListener listener = new AprLifecycleListener();
+            Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+            StandardServer server = (StandardServer) tomcat.getServer();
+            server.addLifecycleListener(listener);
+        }
+    }
 }
diff --git a/test/org/apache/tomcat/util/net/TestClientCert.java b/test/org/apache/tomcat/util/net/TestClientCert.java
index b759991..816500e 100644
--- a/test/org/apache/tomcat/util/net/TestClientCert.java
+++ b/test/org/apache/tomcat/util/net/TestClientCert.java
@@ -16,12 +16,21 @@
  */
 package org.apache.tomcat.util.net;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
 
 import org.junit.Assert;
+import org.junit.Assume;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
 
 import org.apache.catalina.Context;
+import org.apache.catalina.core.AprLifecycleListener;
+import org.apache.catalina.core.StandardServer;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.util.buf.ByteChunk;
@@ -31,8 +40,30 @@ import org.apache.tomcat.util.buf.ByteChunk;
  * generated using a test CA the files for which are in the Tomcat PMC private
  * repository since not all of them are AL2 licensed.
  */
+@RunWith(Parameterized.class)
 public class TestClientCert extends TomcatBaseTest {
 
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> parameters() {
+        List<Object[]> parameterSets = new ArrayList<>();
+        parameterSets.add(new Object[] {
+                "JSSE", Boolean.FALSE, "org.apache.tomcat.util.net.jsse.JSSEImplementation"});
+        parameterSets.add(new Object[] {
+                "OpenSSL", Boolean.TRUE, "org.apache.tomcat.util.net.openssl.OpenSSLImplementation"});
+
+        return parameterSets;
+    }
+
+    @Parameter(0)
+    public String connectorName;
+
+    @Parameter(1)
+    public boolean needApr;
+
+    @Parameter(2)
+    public String sslImplementationName;
+
+
     @Test
     public void testClientCertGetWithoutPreemptive() throws Exception {
         doTestClientCertGet(false);
@@ -171,5 +202,14 @@ public class TestClientCert extends TomcatBaseTest {
         TesterSupport.configureClientCertContext(tomcat);
 
         TesterSupport.configureClientSsl();
+
+        Assert.assertTrue(tomcat.getConnector().setProperty("sslImplementationName", sslImplementationName));
+
+        if (needApr) {
+            AprLifecycleListener listener = new AprLifecycleListener();
+            Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+            StandardServer server = (StandardServer) tomcat.getServer();
+            server.addLifecycleListener(listener);
+        }
     }
 }
diff --git a/test/org/apache/tomcat/util/net/TestClientCertTls13.java b/test/org/apache/tomcat/util/net/TestClientCertTls13.java
index 7444ae2..c21ae86 100644
--- a/test/org/apache/tomcat/util/net/TestClientCertTls13.java
+++ b/test/org/apache/tomcat/util/net/TestClientCertTls13.java
@@ -16,15 +16,24 @@
  */
 package org.apache.tomcat.util.net;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
 
 import org.junit.Assert;
 import org.junit.Assume;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
 
 import org.apache.catalina.connector.Connector;
+import org.apache.catalina.core.AprLifecycleListener;
+import org.apache.catalina.core.StandardServer;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
+import org.apache.tomcat.jni.SSL;
 import org.apache.tomcat.util.buf.ByteChunk;
 
 /**
@@ -36,8 +45,30 @@ import org.apache.tomcat.util.buf.ByteChunk;
  * initial handshake. This test requires TLSv1.3 on client and server so it is
  * skipped unless running on a Java version that supports TLSv1.3.
  */
+@RunWith(Parameterized.class)
 public class TestClientCertTls13 extends TomcatBaseTest {
 
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> parameters() {
+        List<Object[]> parameterSets = new ArrayList<>();
+        parameterSets.add(new Object[] {
+                "JSSE", Boolean.FALSE, "org.apache.tomcat.util.net.jsse.JSSEImplementation"});
+        parameterSets.add(new Object[] {
+                "OpenSSL", Boolean.TRUE, "org.apache.tomcat.util.net.openssl.OpenSSLImplementation"});
+
+        return parameterSets;
+    }
+
+    @Parameter(0)
+    public String connectorName;
+
+    @Parameter(1)
+    public boolean needApr;
+
+    @Parameter(2)
+    public String sslImplementationName;
+
+
     @Test
     public void testClientCertGet() throws Exception {
         Tomcat tomcat = getTomcatInstance();
@@ -70,10 +101,23 @@ public class TestClientCertTls13 extends TomcatBaseTest {
 
         Tomcat tomcat = getTomcatInstance();
 
-        Connector connector = tomcat.getConnector();
-        Assume.assumeTrue(TesterSupport.isDefaultTLSProtocolForTesting13(connector));
-
         TesterSupport.configureClientCertContext(tomcat);
+
+        TesterSupport.configureClientSsl();
+
+        Connector connector = tomcat.getConnector();
+        Assert.assertTrue(connector.setProperty("sslImplementationName", sslImplementationName));
+
+        if (needApr) {
+            AprLifecycleListener listener = new AprLifecycleListener();
+            Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+            // Need at least OpenSSL 1.1.1 for TLSv1.3 support
+            Assume.assumeTrue(SSL.version() >= 0x1010100f);
+            StandardServer server = (StandardServer) tomcat.getServer();
+            server.addLifecycleListener(listener);
+        }
+
+        // Tests default to TLSv1.2 when client cert auth is used
         // Need to override some of the previous settings
         SSLHostConfig[] sslHostConfigs = connector.findSslHostConfigs();
         Assert.assertNotNull(sslHostConfigs);
@@ -85,7 +129,5 @@ public class TestClientCertTls13 extends TomcatBaseTest {
         sslHostConfig.setProtocols(Constants.SSL_PROTO_TLSv1_3);
         // And add force authentication to occur on the initial handshake
         sslHostConfig.setCertificateVerification("required");
-
-        TesterSupport.configureClientSsl();
     }
 }
diff --git a/test/org/apache/tomcat/util/net/TestCustomSslTrustManager.java b/test/org/apache/tomcat/util/net/TestCustomSslTrustManager.java
index f5d4c8d..f7ad272 100644
--- a/test/org/apache/tomcat/util/net/TestCustomSslTrustManager.java
+++ b/test/org/apache/tomcat/util/net/TestCustomSslTrustManager.java
@@ -17,13 +17,22 @@
 package org.apache.tomcat.util.net;
 
 import java.net.SocketException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 
 import javax.net.ssl.SSLException;
 
 import org.junit.Assert;
+import org.junit.Assume;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
 
 import org.apache.catalina.connector.Connector;
+import org.apache.catalina.core.AprLifecycleListener;
+import org.apache.catalina.core.StandardServer;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.coyote.ProtocolHandler;
@@ -35,8 +44,30 @@ import org.apache.tomcat.util.buf.ByteChunk;
  * generated using a test CA the files for which are in the Tomcat PMC private
  * repository since not all of them are AL2 licensed.
  */
+@RunWith(Parameterized.class)
 public class TestCustomSslTrustManager extends TomcatBaseTest {
 
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> parameters() {
+        List<Object[]> parameterSets = new ArrayList<>();
+        parameterSets.add(new Object[] {
+                "JSSE", Boolean.FALSE, "org.apache.tomcat.util.net.jsse.JSSEImplementation"});
+        parameterSets.add(new Object[] {
+                "OpenSSL", Boolean.TRUE, "org.apache.tomcat.util.net.openssl.OpenSSLImplementation"});
+
+        return parameterSets;
+    }
+
+    @Parameter(0)
+    public String connectorName;
+
+    @Parameter(1)
+    public boolean needApr;
+
+    @Parameter(2)
+    public String sslImplementationName;
+
+
     private enum TrustType {
         ALL,
         CA,
@@ -66,6 +97,14 @@ public class TestCustomSslTrustManager extends TomcatBaseTest {
         TesterSupport.configureClientCertContext(tomcat);
 
         Connector connector = tomcat.getConnector();
+        Assert.assertTrue(connector.setProperty("sslImplementationName", sslImplementationName));
+
+        if (needApr) {
+            AprLifecycleListener listener = new AprLifecycleListener();
+            Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+            StandardServer server = (StandardServer) tomcat.getServer();
+            server.addLifecycleListener(listener);
+        }
 
         // Override the defaults
         ProtocolHandler handler = connector.getProtocolHandler();
diff --git a/test/org/apache/tomcat/util/net/TestSSLHostConfigCompat.java b/test/org/apache/tomcat/util/net/TestSSLHostConfigCompat.java
index 7e35c8e..30647e0 100644
--- a/test/org/apache/tomcat/util/net/TestSSLHostConfigCompat.java
+++ b/test/org/apache/tomcat/util/net/TestSSLHostConfigCompat.java
@@ -51,11 +51,10 @@ public class TestSSLHostConfigCompat extends TomcatBaseTest {
         List<Object[]> parameterSets = new ArrayList<>();
 
         for (StoreType storeType : new StoreType[] { StoreType.KEYSTORE, StoreType.PEM } ) {
-            parameterSets.add(new Object[] {"NIO-JSSE", "org.apache.coyote.http11.Http11NioProtocol",
-                    "org.apache.tomcat.util.net.jsse.JSSEImplementation", storeType});
-
-            parameterSets.add(new Object[] {"NIO-OpenSSL", "org.apache.coyote.http11.Http11NioProtocol",
-                    "org.apache.tomcat.util.net.openssl.OpenSSLImplementation", storeType});
+            parameterSets.add(new Object[] {
+                    "JSSE", Boolean.FALSE, "org.apache.tomcat.util.net.jsse.JSSEImplementation", storeType});
+            parameterSets.add(new Object[] {
+                    "OpenSSL", Boolean.TRUE, "org.apache.tomcat.util.net.openssl.OpenSSLImplementation", storeType});
         }
 
         return parameterSets;
@@ -65,7 +64,7 @@ public class TestSSLHostConfigCompat extends TomcatBaseTest {
     public String connectorName;
 
     @Parameter(1)
-    public String protocolName;
+    public boolean needApr;
 
     @Parameter(2)
     public String sslImplementationName;
@@ -301,18 +300,9 @@ public class TestSSLHostConfigCompat extends TomcatBaseTest {
 
 
     @Override
-    protected String getProtocol() {
-        return protocolName;
-    }
-
-
-    @Override
     public void setUp() throws Exception {
         super.setUp();
 
-        AprLifecycleListener listener = new AprLifecycleListener();
-        Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
-
         Tomcat tomcat = getTomcatInstance();
         Connector connector = tomcat.getConnector();
 
@@ -323,8 +313,14 @@ public class TestSSLHostConfigCompat extends TomcatBaseTest {
         sslHostConfig.setProtocols("TLSv1.2");
         connector.addSslHostConfig(sslHostConfig);
 
-        StandardServer server = (StandardServer) tomcat.getServer();
-        server.addLifecycleListener(listener);
+        Assert.assertTrue(connector.setProperty("sslImplementationName", sslImplementationName));
+
+        if (needApr) {
+            AprLifecycleListener listener = new AprLifecycleListener();
+            Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+            StandardServer server = (StandardServer) tomcat.getServer();
+            server.addLifecycleListener(listener);
+        }
 
         // Simple webapp
         Context ctxt = tomcat.addContext("", null);
diff --git a/test/org/apache/tomcat/util/net/TestSSLHostConfigIntegration.java b/test/org/apache/tomcat/util/net/TestSSLHostConfigIntegration.java
index cfadc80..34d4f5c 100644
--- a/test/org/apache/tomcat/util/net/TestSSLHostConfigIntegration.java
+++ b/test/org/apache/tomcat/util/net/TestSSLHostConfigIntegration.java
@@ -18,17 +18,48 @@ package org.apache.tomcat.util.net;
 
 import java.io.File;
 import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 
 import org.junit.Assert;
+import org.junit.Assume;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
 
+import org.apache.catalina.core.AprLifecycleListener;
+import org.apache.catalina.core.StandardServer;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;
 import org.apache.tomcat.websocket.server.WsContextListener;
 
+@RunWith(Parameterized.class)
 public class TestSSLHostConfigIntegration extends TomcatBaseTest {
 
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> parameters() {
+        List<Object[]> parameterSets = new ArrayList<>();
+        parameterSets.add(new Object[] {
+                "JSSE", Boolean.FALSE, "org.apache.tomcat.util.net.jsse.JSSEImplementation"});
+        parameterSets.add(new Object[] {
+                "OpenSSL", Boolean.TRUE, "org.apache.tomcat.util.net.openssl.OpenSSLImplementation"});
+
+        return parameterSets;
+    }
+
+    @Parameter(0)
+    public String connectorName;
+
+    @Parameter(1)
+    public boolean needApr;
+
+    @Parameter(2)
+    public String sslImplementationName;
+
+
     @Test
     public void testSslHostConfigIsSerializable() throws Exception {
         Tomcat tomcat = getTomcatInstance();
@@ -39,6 +70,14 @@ public class TestSSLHostConfigIntegration extends TomcatBaseTest {
         ctxt.addApplicationListener(WsContextListener.class.getName());
 
         TesterSupport.initSsl(tomcat);
+        Assert.assertTrue(tomcat.getConnector().setProperty("sslImplementationName", sslImplementationName));
+
+        if (needApr) {
+            AprLifecycleListener listener = new AprLifecycleListener();
+            Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+            StandardServer server = (StandardServer) tomcat.getServer();
+            server.addLifecycleListener(listener);
+        }
 
         tomcat.start();
 
diff --git a/test/org/apache/tomcat/util/net/TestSsl.java b/test/org/apache/tomcat/util/net/TestSsl.java
index d7881cf..3ab33e3 100644
--- a/test/org/apache/tomcat/util/net/TestSsl.java
+++ b/test/org/apache/tomcat/util/net/TestSsl.java
@@ -23,7 +23,10 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.io.Reader;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -42,9 +45,15 @@ import jakarta.servlet.http.HttpServletResponse;
 import org.junit.Assert;
 import org.junit.Assume;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
 
 import org.apache.catalina.Context;
 import org.apache.catalina.Wrapper;
+import org.apache.catalina.connector.Connector;
+import org.apache.catalina.core.AprLifecycleListener;
+import org.apache.catalina.core.StandardServer;
 import org.apache.catalina.startup.TesterServlet;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
@@ -56,8 +65,30 @@ import org.apache.tomcat.websocket.server.WsContextListener;
  * generated using a test CA the files for which are in the Tomcat PMC private
  * repository since not all of them are AL2 licensed.
  */
+@RunWith(Parameterized.class)
 public class TestSsl extends TomcatBaseTest {
 
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> parameters() {
+        List<Object[]> parameterSets = new ArrayList<>();
+        parameterSets.add(new Object[] {
+                "JSSE", Boolean.FALSE, "org.apache.tomcat.util.net.jsse.JSSEImplementation"});
+        parameterSets.add(new Object[] {
+                "OpenSSL", Boolean.TRUE, "org.apache.tomcat.util.net.openssl.OpenSSLImplementation"});
+
+        return parameterSets;
+    }
+
+    @Parameter(0)
+    public String connectorName;
+
+    @Parameter(1)
+    public boolean needApr;
+
+    @Parameter(2)
+    public String sslImplementationName;
+
+
     @Test
     public void testSimpleSsl() throws Exception {
         TesterSupport.configureClientSsl();
@@ -70,6 +101,14 @@ public class TestSsl extends TomcatBaseTest {
         ctxt.addApplicationListener(WsContextListener.class.getName());
 
         TesterSupport.initSsl(tomcat);
+        Assert.assertTrue(tomcat.getConnector().setProperty("sslImplementationName", sslImplementationName));
+
+        if (needApr) {
+            AprLifecycleListener listener = new AprLifecycleListener();
+            Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+            StandardServer server = (StandardServer) tomcat.getServer();
+            server.addLifecycleListener(listener);
+        }
 
         tomcat.start();
         ByteChunk res = getUrl("https://localhost:" + getPort() +
@@ -93,8 +132,17 @@ public class TestSsl extends TomcatBaseTest {
 
         Tomcat tomcat = getTomcatInstance();
         TesterSupport.initSsl(tomcat);
+        Connector connector = tomcat.getConnector();
         // Increase timeout as default (3s) can be too low for some CI systems
-        Assert.assertTrue(tomcat.getConnector().setProperty("connectionTimeout", "20000"));
+        Assert.assertTrue(connector.setProperty("connectionTimeout", "20000"));
+        Assert.assertTrue(connector.setProperty("sslImplementationName", sslImplementationName));
+
+        if (needApr) {
+            AprLifecycleListener listener = new AprLifecycleListener();
+            Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+            StandardServer server = (StandardServer) tomcat.getServer();
+            server.addLifecycleListener(listener);
+        }
 
         Context ctxt = tomcat.addContext("", null);
         Tomcat.addServlet(ctxt, "post", new SimplePostServlet());
@@ -178,6 +226,15 @@ public class TestSsl extends TomcatBaseTest {
         TesterSupport.initSsl(tomcat, TesterSupport.LOCALHOST_KEYPASS_JKS,
                 TesterSupport.JKS_PASS, TesterSupport.JKS_KEY_PASS);
 
+        Assert.assertTrue(tomcat.getConnector().setProperty("sslImplementationName", sslImplementationName));
+
+        if (needApr) {
+            AprLifecycleListener listener = new AprLifecycleListener();
+            Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+            StandardServer server = (StandardServer) tomcat.getServer();
+            server.addLifecycleListener(listener);
+        }
+
         tomcat.start();
         ByteChunk res = getUrl("https://localhost:" + getPort() +
             "/examples/servlets/servlet/HelloWorldExample");
@@ -191,28 +248,35 @@ public class TestSsl extends TomcatBaseTest {
     public void testRenegotiateWorks() throws Exception {
         Tomcat tomcat = getTomcatInstance();
 
+        TesterSupport.initSsl(tomcat);
+
+        Assert.assertTrue(tomcat.getConnector().setProperty("sslImplementationName", sslImplementationName));
+
         Assume.assumeTrue("SSL renegotiation has to be supported for this test",
                 TesterSupport.isClientRenegotiationSupported(getTomcatInstance()));
 
+        if (needApr) {
+            AprLifecycleListener listener = new AprLifecycleListener();
+            Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+            StandardServer server = (StandardServer) tomcat.getServer();
+            server.addLifecycleListener(listener);
+        }
+
         Context root = tomcat.addContext("", TEMP_DIR);
         Wrapper w =
             Tomcat.addServlet(root, "tester", new TesterServlet());
         w.setAsyncSupported(true);
         root.addServletMappingDecoded("/", "tester");
 
-        TesterSupport.initSsl(tomcat);
 
         tomcat.start();
 
         SSLContext sslCtx;
-        if (TesterSupport.isDefaultTLSProtocolForTesting13(tomcat.getConnector())) {
-            // Force TLS 1.2 if TLS 1.3 is available as JSSE's TLS 1.3
-            // implementation doesn't support Post Handshake Authentication
-            // which is required for this test to pass.
-            sslCtx = SSLContext.getInstance(Constants.SSL_PROTO_TLSv1_2);
-        } else {
-            sslCtx = SSLContext.getInstance(Constants.SSL_PROTO_TLS);
-        }
+        // Force TLS 1.2 if TLS 1.3 is available as JSSE's TLS 1.3
+        // implementation doesn't support Post Handshake Authentication
+        // which is required for this test to pass.
+        sslCtx = SSLContext.getInstance(Constants.SSL_PROTO_TLSv1_2);
+
         sslCtx.init(null, TesterSupport.getTrustManagers(), null);
         SSLSocketFactory socketFactory = sslCtx.getSocketFactory();
         SSLSocket socket = (SSLSocket) socketFactory.createSocket("localhost",
diff --git a/test/org/apache/tomcat/util/net/TesterSupport.java b/test/org/apache/tomcat/util/net/TesterSupport.java
index 8ac02c3..02b0268 100644
--- a/test/org/apache/tomcat/util/net/TesterSupport.java
+++ b/test/org/apache/tomcat/util/net/TesterSupport.java
@@ -60,11 +60,11 @@ import org.apache.catalina.startup.Tomcat;
 import org.apache.tomcat.jni.Library;
 import org.apache.tomcat.jni.LibraryNotFoundError;
 import org.apache.tomcat.jni.SSL;
-import org.apache.tomcat.util.compat.JrePlatform;
 import org.apache.tomcat.util.descriptor.web.LoginConfig;
 import org.apache.tomcat.util.descriptor.web.SecurityCollection;
 import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
 import org.apache.tomcat.util.net.SSLHostConfigCertificate.Type;
+import org.apache.tomcat.util.net.jsse.JSSEImplementation;
 
 public final class TesterSupport {
 
@@ -220,14 +220,10 @@ public final class TesterSupport {
     }
 
     protected static boolean isClientRenegotiationSupported(Tomcat tomcat) {
-        String protocol = tomcat.getConnector().getProtocolHandlerClassName();
-        if (protocol.contains("NioProtocol") || (protocol.contains("Nio2Protocol") && JrePlatform.IS_MAC_OS)) {
-            // Doesn't work on all platforms - see BZ 56448.
-            return false;
-        }
-        String sslImplementation = System.getProperty("tomcat.test.sslImplementation");
-        if (sslImplementation != null && !"${test.sslImplementation}".equals(sslImplementation)) {
-            // Assume custom SSL is not supporting this
+        // Disabled for Tomcat Native (part if response to CVE-2009-3555)
+        // Only JRE provided JSSE implementation supports this
+        String sslImplementation = (String) tomcat.getConnector().getProperty("sslImplementationName");
+        if (!JSSEImplementation.class.getName().equals(sslImplementation)) {
             return false;
         }
 
@@ -642,36 +638,4 @@ public final class TesterSupport {
             return socket;
         }
     }
-
-
-    /*
-     * We want to use TLS 1.3 where we can but this requires TLS 1.3 to be
-     * supported on the client and the server.
-     */
-    public static String getDefaultTLSProtocolForTesting(Connector connector) {
-        // Clients always use JSSE
-        if (!TLSV13_AVAILABLE) {
-            // Client doesn't support TLS 1.3 so we have to use TLS 1.2
-            return Constants.SSL_PROTO_TLSv1_2;
-        }
-
-        if (connector.getProtocolHandlerClassName().contains("Apr")) {
-            // APR connector so OpenSSL is used for TLS.
-            if (SSL.version() >= 0x1010100f) {
-                return Constants.SSL_PROTO_TLSv1_3;
-            } else {
-                return Constants.SSL_PROTO_TLSv1_2;
-            }
-        } else {
-            // NIO or NIO2. Tests do not use JSSE+OpenSSL so JSSE will be used.
-            // Due to check above, it is known that TLS 1.3 is available
-            return Constants.SSL_PROTO_TLSv1_3;
-        }
-    }
-
-
-    public static boolean isDefaultTLSProtocolForTesting13(Connector connector) {
-        return Constants.SSL_PROTO_TLSv1_3.equals(
-                TesterSupport.getDefaultTLSProtocolForTesting(connector));
-    }
 }
diff --git a/test/org/apache/tomcat/util/net/openssl/TestOpenSSLConf.java b/test/org/apache/tomcat/util/net/openssl/TestOpenSSLConf.java
index 3eb1f7a..06c80ab 100644
--- a/test/org/apache/tomcat/util/net/openssl/TestOpenSSLConf.java
+++ b/test/org/apache/tomcat/util/net/openssl/TestOpenSSLConf.java
@@ -27,6 +27,9 @@ import org.junit.Assert;
 import org.junit.Assume;
 import org.junit.Test;
 
+import org.apache.catalina.connector.Connector;
+import org.apache.catalina.core.AprLifecycleListener;
+import org.apache.catalina.core.StandardServer;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.catalina.startup.TomcatBaseTest;
 import org.apache.tomcat.jni.SSLContext;
@@ -49,19 +52,16 @@ public class TestOpenSSLConf extends TomcatBaseTest {
         return OPENSSL_VERSION >= OPENSSL_TLS13_SUPPORT_MIN_VERSION;
     }
 
-    public SSLHostConfig initOpenSSLConfCmd(String... commands) throws Exception {
+    private SSLHostConfig initOpenSSLConfCmd(String... commands) throws Exception {
         Assert.assertNotNull(commands);
         Assert.assertTrue("Invalid length", commands.length % 2 == 0);
 
         Tomcat tomcat = getTomcatInstance();
+        Connector connector = tomcat.getConnector();
 
         TesterSupport.initSsl(tomcat);
 
-        // The tests are only supported for OpenSSL
-        String sslImplementation = String.valueOf(
-                tomcat.getConnector().getProperty("sslImplementationName"));
-        Assume.assumeTrue("This test is only for OpenSSL based SSL connectors",
-                sslImplementation.contains("openssl"));
+        Assert.assertTrue(connector.setProperty("sslImplementationName", OpenSSLImplementation.class.getName()));
 
         OpenSSLConf conf = new OpenSSLConf();
         for (int i = 0; i < commands.length;) {
@@ -71,26 +71,19 @@ public class TestOpenSSLConf extends TomcatBaseTest {
             conf.addCmd(cmd);
         }
 
-        SSLHostConfig[] sslHostConfigs = tomcat.getConnector().
-                                         getProtocolHandler().findSslHostConfigs();
+        SSLHostConfig[] sslHostConfigs = connector.getProtocolHandler().findSslHostConfigs();
         Assert.assertEquals("Wrong SSLHostConfigCount", 1, sslHostConfigs.length);
         sslHostConfigs[0].setOpenSslConf(conf);
 
         tomcat.start();
 
-        sslHostConfigs = tomcat.getConnector().getProtocolHandler().findSslHostConfigs();
+        sslHostConfigs = connector.getProtocolHandler().findSslHostConfigs();
         Assert.assertEquals("Wrong SSLHostConfigCount", 1, sslHostConfigs.length);
         return sslHostConfigs[0];
     }
 
     @Test
     public void testOpenSSLConfCmdCipher() throws Exception {
-        if (TesterSupport.isOpensslAvailable()) {
-          log.info("Found OpenSSL version 0x" + Integer.toHexString(OPENSSL_VERSION));
-        } else {
-          log.warn("OpenSSL not found: " + TesterSupport.OPENSSL_ERROR);
-        }
-
         SSLHostConfig sslHostConfig;
         if (hasTLS13()) {
             // Ensure TLSv1.3 ciphers aren't returned
@@ -109,12 +102,6 @@ public class TestOpenSSLConf extends TomcatBaseTest {
 
     @Test
     public void testOpenSSLConfCmdProtocol() throws Exception {
-        if (TesterSupport.isOpensslAvailable()) {
-          log.info("Found OpenSSL version 0x" + Integer.toHexString(OPENSSL_VERSION));
-        } else {
-          log.warn("OpenSSL not found: " + TesterSupport.OPENSSL_ERROR);
-        }
-
         Set<String> disabledProtocols = new HashSet<>(Arrays.asList(DISABLED_PROTOCOLS));
         StringBuilder sb = new StringBuilder();
         for (String protocol : DISABLED_PROTOCOLS) {
@@ -142,4 +129,20 @@ public class TestOpenSSLConf extends TomcatBaseTest {
                     enabledProtocols.contains(protocol));
         }
     }
+
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        // Tests are only intended for OpenSSL
+        Assume.assumeTrue(TesterSupport.isOpensslAvailable());
+
+        Tomcat tomcat = getTomcatInstance();
+
+        AprLifecycleListener listener = new AprLifecycleListener();
+        Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+        StandardServer server = (StandardServer) tomcat.getServer();
+        server.addLifecycleListener(listener);
+    }
 }
diff --git a/test/org/apache/tomcat/websocket/TestWebSocketFrameClientSSL.java b/test/org/apache/tomcat/websocket/TestWebSocketFrameClientSSL.java
index be84b5e..36751f4 100644
--- a/test/org/apache/tomcat/websocket/TestWebSocketFrameClientSSL.java
+++ b/test/org/apache/tomcat/websocket/TestWebSocketFrameClientSSL.java
@@ -17,6 +17,9 @@
 package org.apache.tomcat.websocket;
 
 import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 import java.util.Queue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -28,9 +31,15 @@ import jakarta.websocket.Session;
 import jakarta.websocket.WebSocketContainer;
 
 import org.junit.Assert;
+import org.junit.Assume;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
 
 import org.apache.catalina.Context;
+import org.apache.catalina.core.AprLifecycleListener;
+import org.apache.catalina.core.StandardServer;
 import org.apache.catalina.servlets.DefaultServlet;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.tomcat.util.net.TesterSupport;
@@ -38,8 +47,30 @@ import org.apache.tomcat.websocket.TesterMessageCountClient.BasicText;
 import org.apache.tomcat.websocket.TesterMessageCountClient.SleepingText;
 import org.apache.tomcat.websocket.TesterMessageCountClient.TesterProgrammaticEndpoint;
 
+@RunWith(Parameterized.class)
 public class TestWebSocketFrameClientSSL extends WebSocketBaseTest {
 
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> parameters() {
+        List<Object[]> parameterSets = new ArrayList<>();
+        parameterSets.add(new Object[] {
+                "JSSE", Boolean.FALSE, "org.apache.tomcat.util.net.jsse.JSSEImplementation"});
+        parameterSets.add(new Object[] {
+                "OpenSSL", Boolean.TRUE, "org.apache.tomcat.util.net.openssl.OpenSSLImplementation"});
+
+        return parameterSets;
+    }
+
+    @Parameter(0)
+    public String connectorName;
+
+    @Parameter(1)
+    public boolean needApr;
+
+    @Parameter(2)
+    public String sslImplementationName;
+
+
     @Test
     public void testConnectToServerEndpoint() throws Exception {
         Tomcat tomcat = getTomcatInstance();
@@ -49,8 +80,6 @@ public class TestWebSocketFrameClientSSL extends WebSocketBaseTest {
         Tomcat.addServlet(ctx, "default", new DefaultServlet());
         ctx.addServletMappingDecoded("/", "default");
 
-        TesterSupport.initSsl(tomcat);
-
         tomcat.start();
 
         WebSocketContainer wsContainer =
@@ -96,8 +125,6 @@ public class TestWebSocketFrameClientSSL extends WebSocketBaseTest {
         Tomcat.addServlet(ctx, "default", new DefaultServlet());
         ctx.addServletMappingDecoded("/", "default");
 
-        TesterSupport.initSsl(tomcat);
-
         tomcat.start();
 
         WebSocketContainer wsContainer =
@@ -150,4 +177,23 @@ public class TestWebSocketFrameClientSSL extends WebSocketBaseTest {
         // Close the client session.
         wsSession.close();
     }
+
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        Tomcat tomcat = getTomcatInstance();
+
+        TesterSupport.initSsl(tomcat);
+
+        Assert.assertTrue(tomcat.getConnector().setProperty("sslImplementationName", sslImplementationName));
+
+        if (needApr) {
+            AprLifecycleListener listener = new AprLifecycleListener();
+            Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+            StandardServer server = (StandardServer) tomcat.getServer();
+            server.addLifecycleListener(listener);
+        }
+    }
 }
diff --git a/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java b/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
index df5a2db..347fa20 100644
--- a/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
+++ b/test/org/apache/tomcat/websocket/TestWsWebSocketContainer.java
@@ -50,7 +50,6 @@ import org.junit.Test;
 import org.apache.catalina.Context;
 import org.apache.catalina.servlets.DefaultServlet;
 import org.apache.catalina.startup.Tomcat;
-import org.apache.tomcat.util.net.TesterSupport;
 import org.apache.tomcat.websocket.TesterMessageCountClient.BasicBinary;
 import org.apache.tomcat.websocket.TesterMessageCountClient.BasicHandler;
 import org.apache.tomcat.websocket.TesterMessageCountClient.BasicText;
@@ -895,47 +894,6 @@ public class TestWsWebSocketContainer extends WebSocketBaseTest {
 
 
     @Test
-    public void testConnectToServerEndpointSSL() throws Exception {
-
-        Tomcat tomcat = getTomcatInstance();
-        // No file system docBase required
-        Context ctx = tomcat.addContext("", null);
-        ctx.addApplicationListener(TesterEchoServer.Config.class.getName());
-        Tomcat.addServlet(ctx, "default", new DefaultServlet());
-        ctx.addServletMappingDecoded("/", "default");
-
-        TesterSupport.initSsl(tomcat);
-
-        tomcat.start();
-
-        WebSocketContainer wsContainer =
-                ContainerProvider.getWebSocketContainer();
-        ClientEndpointConfig clientEndpointConfig =
-                ClientEndpointConfig.Builder.create().build();
-        clientEndpointConfig.getUserProperties().put(
-                org.apache.tomcat.websocket.Constants.SSL_TRUSTSTORE_PROPERTY,
-                TesterSupport.CA_JKS);
-        Session wsSession = wsContainer.connectToServer(
-                TesterProgrammaticEndpoint.class,
-                clientEndpointConfig,
-                new URI("wss://" + getHostName() + ":" + getPort() +
-                        TesterEchoServer.Config.PATH_ASYNC));
-        CountDownLatch latch = new CountDownLatch(1);
-        BasicText handler = new BasicText(latch);
-        wsSession.addMessageHandler(handler);
-        wsSession.getBasicRemote().sendText(MESSAGE_STRING_1);
-
-        boolean latchResult = handler.getLatch().await(10, TimeUnit.SECONDS);
-
-        Assert.assertTrue(latchResult);
-
-        Queue<String> messages = handler.getMessages();
-        Assert.assertEquals(1, messages.size());
-        Assert.assertEquals(MESSAGE_STRING_1, messages.peek());
-    }
-
-
-    @Test
     public void testMaxMessageSize01() throws Exception {
         doMaxMessageSize(TesterEchoServer.Config.PATH_BASIC_LIMIT_LOW,
                 TesterEchoServer.BasicLimitLow.MAX_SIZE - 1, true);
diff --git a/test/org/apache/tomcat/websocket/TestWsWebSocketContainerSSL.java b/test/org/apache/tomcat/websocket/TestWsWebSocketContainerSSL.java
new file mode 100644
index 0000000..12e4a4f
--- /dev/null
+++ b/test/org/apache/tomcat/websocket/TestWsWebSocketContainerSSL.java
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.tomcat.websocket;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Queue;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import jakarta.websocket.ClientEndpointConfig;
+import jakarta.websocket.ContainerProvider;
+import jakarta.websocket.Session;
+import jakarta.websocket.WebSocketContainer;
+
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+
+import org.apache.catalina.Context;
+import org.apache.catalina.core.AprLifecycleListener;
+import org.apache.catalina.core.StandardServer;
+import org.apache.catalina.servlets.DefaultServlet;
+import org.apache.catalina.startup.Tomcat;
+import org.apache.tomcat.util.net.TesterSupport;
+import org.apache.tomcat.websocket.TesterMessageCountClient.BasicText;
+import org.apache.tomcat.websocket.TesterMessageCountClient.TesterProgrammaticEndpoint;
+
+@RunWith(Parameterized.class)
+public class TestWsWebSocketContainerSSL extends WebSocketBaseTest {
+
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> parameters() {
+        List<Object[]> parameterSets = new ArrayList<>();
+        parameterSets.add(new Object[] {
+                "JSSE", Boolean.FALSE, "org.apache.tomcat.util.net.jsse.JSSEImplementation"});
+        parameterSets.add(new Object[] {
+                "OpenSSL", Boolean.TRUE, "org.apache.tomcat.util.net.openssl.OpenSSLImplementation"});
+
+        return parameterSets;
+    }
+
+    @Parameter(0)
+    public String connectorName;
+
+    @Parameter(1)
+    public boolean needApr;
+
+    @Parameter(2)
+    public String sslImplementationName;
+
+
+    private static final String MESSAGE_STRING_1 = "qwerty";
+
+    @Test
+    public void testConnectToServerEndpointSSL() throws Exception {
+
+        Tomcat tomcat = getTomcatInstance();
+        // No file system docBase required
+        Context ctx = tomcat.addContext("", null);
+        ctx.addApplicationListener(TesterEchoServer.Config.class.getName());
+        Tomcat.addServlet(ctx, "default", new DefaultServlet());
+        ctx.addServletMappingDecoded("/", "default");
+
+        tomcat.start();
+
+        WebSocketContainer wsContainer =
+                ContainerProvider.getWebSocketContainer();
+        ClientEndpointConfig clientEndpointConfig =
+                ClientEndpointConfig.Builder.create().build();
+        clientEndpointConfig.getUserProperties().put(
+                org.apache.tomcat.websocket.Constants.SSL_TRUSTSTORE_PROPERTY,
+                TesterSupport.CA_JKS);
+        Session wsSession = wsContainer.connectToServer(
+                TesterProgrammaticEndpoint.class,
+                clientEndpointConfig,
+                new URI("wss://localhost:" + getPort() +
+                        TesterEchoServer.Config.PATH_ASYNC));
+        CountDownLatch latch = new CountDownLatch(1);
+        BasicText handler = new BasicText(latch);
+        wsSession.addMessageHandler(handler);
+        wsSession.getBasicRemote().sendText(MESSAGE_STRING_1);
+
+        boolean latchResult = handler.getLatch().await(10, TimeUnit.SECONDS);
+
+        Assert.assertTrue(latchResult);
+
+        Queue<String> messages = handler.getMessages();
+        Assert.assertEquals(1, messages.size());
+        Assert.assertEquals(MESSAGE_STRING_1, messages.peek());
+    }
+
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+
+        Tomcat tomcat = getTomcatInstance();
+
+        TesterSupport.initSsl(tomcat);
+
+        Assert.assertTrue(tomcat.getConnector().setProperty("sslImplementationName", sslImplementationName));
+
+        if (needApr) {
+            AprLifecycleListener listener = new AprLifecycleListener();
+            Assume.assumeTrue(AprLifecycleListener.isAprAvailable());
+            StandardServer server = (StandardServer) tomcat.getServer();
+            server.addLifecycleListener(listener);
+        }
+    }
+}

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org