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

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


The following commit(s) were added to refs/heads/main by this push:
     new abb6ed3  NIFI-8171 This closes #4779. Upgraded Bouncy Castle libraries 
to 1.68 and centralized dependency version NIFI-8171 Increased response and 
idle timeouts for HTTP unit tests NIFI-8171 Increased TestServer idle timeout 
to 45 seconds for HTTP unit tests NIFI-8171 Adjusted timeout and sleep on 
TestPutTCPCommon.testPruneSenders NIFI-8171 Increased TestServer idle timeout 
to 60 seconds and removed 500ms Thread.sleep() in TestInvokeHttpSSL NIFI-8171 
Optimized OkHttpClientUtils t [...]
abb6ed3 is described below

commit abb6ed3128d789316e6741c3bf25ffd9bed8cf77
Author: exceptionfactory <[email protected]>
AuthorDate: Mon Jan 25 07:42:06 2021 -0600

    NIFI-8171 This closes #4779. Upgraded Bouncy Castle libraries to 1.68 and 
centralized dependency version
    NIFI-8171 Increased response and idle timeouts for HTTP unit tests
    NIFI-8171 Increased TestServer idle timeout to 45 seconds for HTTP unit 
tests
    NIFI-8171 Adjusted timeout and sleep on TestPutTCPCommon.testPruneSenders
    NIFI-8171 Increased TestServer idle timeout to 60 seconds and removed 500ms 
Thread.sleep() in TestInvokeHttpSSL
    NIFI-8171 Optimized OkHttpClientUtils to avoid reading trust store twice 
during initialization
    NIFI-8171 Added static variable for server startup sleep
    NIFI-8171 Increased TestInvokeHTTP Connect Timeout and TestListenHTTP 
Response Timeout to 30 seconds
    NIFI-8171 Refactored unit tests for InvokeHTTP and ListenHTTP to optimize 
SSLContext creation
    NIFI-8171 Updated TestListenHTTP for static creation of SSLContext
    NIFI-8171 Added started check for ListenHTTP Server in TestListenHTTP
    NIFI-8171 Refactored TestPutTCP classes to optimize SSLContext creation
    NIFI-8171 Increased TestListenHTTP timeout for server start to 120 seconds 
and added exception when not connected
    NIFI-8171 Increased Connect and Read Timeouts for InvokeHTTP SSL unit tests
    
    Signed-off-by: Joe Witt <[email protected]>
---
 nifi-commons/nifi-data-provenance-utils/pom.xml    |   1 -
 nifi-commons/nifi-security-utils/pom.xml           |   2 -
 .../nifi/security/util/OkHttpClientUtils.java      |  19 +-
 .../nifi-druid-controller-service-api/pom.xml      |   1 -
 nifi-nar-bundles/nifi-framework-bundle/pom.xml     |  10 -
 .../nifi-provenance-repository-bundle/pom.xml      |   5 -
 .../nifi/processors/standard/InvokeHTTP.java       |  19 +-
 .../nifi/processors/standard/TestInvokeHTTP.java   |  37 +---
 .../processors/standard/TestInvokeHttpSSL.java     | 164 +++++----------
 .../standard/TestInvokeHttpTwoWaySSL.java          |  43 ++--
 .../nifi/processors/standard/TestListenHTTP.java   | 226 +++++++++++++--------
 .../nifi/processors/standard/TestPutTCP.java       |   3 -
 .../nifi/processors/standard/TestPutTcpSSL.java    |  61 +++---
 .../processors/standard/util/TCPTestServer.java    |  17 +-
 .../standard/util/TestInvokeHttpCommon.java        |  67 +++++-
 .../processors/standard/util/TestPutTCPCommon.java |  11 +-
 .../org/apache/nifi/web/util/JettyServerUtils.java |  88 ++++++++
 .../java/org/apache/nifi/web/util/TestServer.java  |  20 +-
 nifi-nar-bundles/nifi-standard-bundle/pom.xml      |  15 --
 nifi-toolkit/nifi-toolkit-tls/pom.xml              |   2 -
 pom.xml                                            |  16 ++
 21 files changed, 455 insertions(+), 372 deletions(-)

diff --git a/nifi-commons/nifi-data-provenance-utils/pom.xml 
b/nifi-commons/nifi-data-provenance-utils/pom.xml
index 9c13053..8e5a757 100644
--- a/nifi-commons/nifi-data-provenance-utils/pom.xml
+++ b/nifi-commons/nifi-data-provenance-utils/pom.xml
@@ -45,7 +45,6 @@
         <dependency>
             <groupId>org.bouncycastle</groupId>
             <artifactId>bcprov-jdk15on</artifactId>
-            <version>1.66</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
diff --git a/nifi-commons/nifi-security-utils/pom.xml 
b/nifi-commons/nifi-security-utils/pom.xml
index 9716b56..05302e4 100644
--- a/nifi-commons/nifi-security-utils/pom.xml
+++ b/nifi-commons/nifi-security-utils/pom.xml
@@ -60,12 +60,10 @@
         <dependency>
             <groupId>org.bouncycastle</groupId>
             <artifactId>bcprov-jdk15on</artifactId>
-            <version>1.66</version>
         </dependency>
         <dependency>
             <groupId>org.bouncycastle</groupId>
             <artifactId>bcpkix-jdk15on</artifactId>
-            <version>1.66</version>
         </dependency>
         <dependency>
             <groupId>org.apache.nifi</groupId>
diff --git 
a/nifi-commons/nifi-web-utils/src/main/java/org/apache/nifi/security/util/OkHttpClientUtils.java
 
b/nifi-commons/nifi-web-utils/src/main/java/org/apache/nifi/security/util/OkHttpClientUtils.java
index f35eba5..6aeb151 100644
--- 
a/nifi-commons/nifi-web-utils/src/main/java/org/apache/nifi/security/util/OkHttpClientUtils.java
+++ 
b/nifi-commons/nifi-web-utils/src/main/java/org/apache/nifi/security/util/OkHttpClientUtils.java
@@ -17,7 +17,9 @@
 package org.apache.nifi.security.util;
 
 import java.security.UnrecoverableKeyException;
+import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
 import javax.net.ssl.X509TrustManager;
 import okhttp3.OkHttpClient;
 import org.apache.nifi.processor.exception.ProcessException;
@@ -41,12 +43,19 @@ public class OkHttpClientUtils {
      */
     public static boolean applyTlsToOkHttpClientBuilder(TlsConfiguration 
tlsConfiguration, OkHttpClient.Builder okHttpClient) {
         try {
-            final SSLSocketFactory sslSocketFactory = 
SslContextFactory.createSSLSocketFactory(tlsConfiguration);
-            final X509TrustManager x509TrustManager = 
SslContextFactory.getX509TrustManager(tlsConfiguration);
-            if (sslSocketFactory != null && x509TrustManager != null) {
-                okHttpClient.sslSocketFactory(sslSocketFactory, 
x509TrustManager);
-                return true;
+            final X509TrustManager trustManager = 
SslContextFactory.getX509TrustManager(tlsConfiguration);
+            if (trustManager == null) {
+                return false;
             }
+
+            final SSLContext sslContext = 
SslContextFactory.createSslContext(tlsConfiguration, new 
TrustManager[]{trustManager});
+            if (sslContext == null) {
+                return false;
+            }
+
+            final SSLSocketFactory sslSocketFactory = 
sslContext.getSocketFactory();
+            okHttpClient.sslSocketFactory(sslSocketFactory, trustManager);
+            return true;
         } catch (TlsException e) {
             if (e.getCause() instanceof UnrecoverableKeyException) {
                 logger.error("Key password may be incorrect or not set. Check 
your keystore passwords." + e.getMessage());
diff --git 
a/nifi-nar-bundles/nifi-druid-bundle/nifi-druid-controller-service-api/pom.xml 
b/nifi-nar-bundles/nifi-druid-bundle/nifi-druid-controller-service-api/pom.xml
index 54fbdcf..47fc540 100644
--- 
a/nifi-nar-bundles/nifi-druid-bundle/nifi-druid-controller-service-api/pom.xml
+++ 
b/nifi-nar-bundles/nifi-druid-bundle/nifi-druid-controller-service-api/pom.xml
@@ -135,7 +135,6 @@
         <dependency>
             <groupId>org.bouncycastle</groupId>
             <artifactId>bcprov-jdk15on</artifactId>
-            <version>1.66</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>
diff --git a/nifi-nar-bundles/nifi-framework-bundle/pom.xml 
b/nifi-nar-bundles/nifi-framework-bundle/pom.xml
index 04922da..2ac511f 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/pom.xml
+++ b/nifi-nar-bundles/nifi-framework-bundle/pom.xml
@@ -321,16 +321,6 @@
                 <version>1.4.199</version>
             </dependency>
             <dependency>
-                <groupId>org.bouncycastle</groupId>
-                <artifactId>bcprov-jdk15on</artifactId>
-                <version>1.66</version>
-            </dependency>
-            <dependency>
-                <groupId>org.bouncycastle</groupId>
-                <artifactId>bcpkix-jdk15on</artifactId>
-                <version>1.66</version>
-            </dependency>
-            <dependency>
                 <groupId>com.google.guava</groupId>
                 <artifactId>guava</artifactId>
                 <version>28.0-jre</version>
diff --git a/nifi-nar-bundles/nifi-provenance-repository-bundle/pom.xml 
b/nifi-nar-bundles/nifi-provenance-repository-bundle/pom.xml
index a6b8f04..140d14d 100644
--- a/nifi-nar-bundles/nifi-provenance-repository-bundle/pom.xml
+++ b/nifi-nar-bundles/nifi-provenance-repository-bundle/pom.xml
@@ -61,11 +61,6 @@
                 <artifactId>commons-lang3</artifactId>
                 <version>3.9</version>
             </dependency>
-            <dependency>
-                <groupId>org.bouncycastle</groupId>
-                <artifactId>bcprov-jdk15on</artifactId>
-                <version>1.66</version>
-            </dependency>
         </dependencies>
     </dependencyManagement>
 </project>
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java
index 4e91cb7..aa331a6 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/InvokeHTTP.java
@@ -31,12 +31,7 @@ import java.net.Proxy.Type;
 import java.net.URL;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
-import java.security.KeyManagementException;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
 import java.security.Principal;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.CertificateException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -55,7 +50,11 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import javax.annotation.Nullable;
 import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.X509TrustManager;
+
 import okhttp3.Cache;
 import okhttp3.ConnectionPool;
 import okhttp3.Credentials;
@@ -100,8 +99,9 @@ import 
org.apache.nifi.processors.standard.util.ProxyAuthenticator;
 import 
org.apache.nifi.processors.standard.util.SoftLimitBoundedByteArrayOutputStream;
 import org.apache.nifi.proxy.ProxyConfiguration;
 import org.apache.nifi.proxy.ProxySpec;
-import org.apache.nifi.security.util.OkHttpClientUtils;
+import org.apache.nifi.security.util.SslContextFactory;
 import org.apache.nifi.security.util.TlsConfiguration;
+import org.apache.nifi.security.util.TlsException;
 import org.apache.nifi.ssl.SSLContextService;
 import org.apache.nifi.stream.io.StreamUtils;
 import org.joda.time.format.DateTimeFormat;
@@ -704,7 +704,7 @@ public class InvokeHTTP extends AbstractProcessor {
     }
 
     @OnScheduled
-    public void setUpClient(final ProcessContext context) throws IOException, 
UnrecoverableKeyException, CertificateException, NoSuchAlgorithmException, 
KeyStoreException, KeyManagementException {
+    public void setUpClient(final ProcessContext context) throws TlsException {
         okHttpClientAtomicReference.set(null);
 
         OkHttpClient.Builder okHttpClientBuilder = new 
OkHttpClient().newBuilder();
@@ -761,8 +761,11 @@ public class InvokeHTTP extends AbstractProcessor {
         // Apply the TLS configuration if present
         final SSLContextService sslService = 
context.getProperty(PROP_SSL_CONTEXT_SERVICE).asControllerService(SSLContextService.class);
         if (sslService != null) {
+            final SSLContext sslContext = sslService.createContext();
+            final SSLSocketFactory socketFactory = 
sslContext.getSocketFactory();
             final TlsConfiguration tlsConfiguration = 
sslService.createTlsConfiguration();
-            OkHttpClientUtils.applyTlsToOkHttpClientBuilder(tlsConfiguration, 
okHttpClientBuilder);
+            final X509TrustManager trustManager = 
SslContextFactory.getX509TrustManager(tlsConfiguration);
+            okHttpClientBuilder.sslSocketFactory(socketFactory, trustManager);
         }
 
         setAuthenticator(okHttpClientBuilder, context);
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestInvokeHTTP.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestInvokeHTTP.java
index 860b68f..561b44f 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestInvokeHTTP.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestInvokeHTTP.java
@@ -31,18 +31,13 @@ import java.util.HashMap;
 import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang3.SystemUtils;
 import org.apache.nifi.processors.standard.util.TestInvokeHttpCommon;
 import org.apache.nifi.ssl.StandardSSLContextService;
 import org.apache.nifi.util.MockFlowFile;
 import org.apache.nifi.util.TestRunners;
-import org.apache.nifi.web.util.TestServer;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.handler.AbstractHandler;
-import org.junit.After;
-import org.junit.AfterClass;
 import org.junit.Assert;
-import org.junit.Assume;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -54,40 +49,12 @@ public class TestInvokeHTTP extends TestInvokeHttpCommon {
 
     @BeforeClass
     public static void beforeClass() throws Exception {
-        Assume.assumeTrue("Test only runs on *nix", 
!SystemUtils.IS_OS_WINDOWS);
-        // useful for verbose logging output
-        // don't commit this with this property enabled, or any 'mvn test' 
will be really verbose
-        // 
System.setProperty("org.slf4j.simpleLogger.log.nifi.processors.standard", 
"debug");
-
-        // create a Jetty server on a random port
-        server = createServer();
-        server.startServer();
-
-        // this is the base url with the random port
-        url = server.getUrl();
-    }
-
-    @AfterClass
-    public static void afterClass() throws Exception {
-        if(server != null) {
-            server.shutdownServer();
-        }
+        configureServer(null, null);
     }
 
     @Before
-    public void before() {
+    public void before() throws Exception {
         runner = TestRunners.newTestRunner(InvokeHTTP.class);
-
-        server.clearHandlers();
-    }
-
-    @After
-    public void after() {
-        runner.shutdown();
-    }
-
-    private static TestServer createServer() {
-        return new TestServer();
     }
 
     @Test
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestInvokeHttpSSL.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestInvokeHttpSSL.java
index 4fbc562..87c10be 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestInvokeHttpSSL.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestInvokeHttpSSL.java
@@ -17,20 +17,20 @@
 
 package org.apache.nifi.processors.standard;
 
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.lang3.SystemUtils;
 import org.apache.nifi.processors.standard.util.TestInvokeHttpCommon;
-import org.apache.nifi.ssl.StandardSSLContextService;
+import org.apache.nifi.security.util.ClientAuth;
+import org.apache.nifi.security.util.KeystoreType;
+import org.apache.nifi.security.util.SslContextFactory;
+import org.apache.nifi.security.util.StandardTlsConfiguration;
+import org.apache.nifi.security.util.TlsConfiguration;
+
+import org.apache.nifi.ssl.SSLContextService;
 import org.apache.nifi.util.TestRunners;
-import org.apache.nifi.web.util.TestServer;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Assume;
 import org.junit.Before;
 import org.junit.BeforeClass;
+import org.mockito.Mockito;
+
+import javax.net.ssl.SSLContext;
 
 /**
  * Executes the same tests as TestInvokeHttp but with one-way SSL enabled.  
The Jetty server created for these tests
@@ -38,115 +38,59 @@ import org.junit.BeforeClass;
  */
 public class TestInvokeHttpSSL extends TestInvokeHttpCommon {
 
-    protected static Map<String, String> sslProperties;
-    protected static Map<String, String> serverSslProperties;
-
+    protected static final String TRUSTSTORE_PATH = 
"src/test/resources/truststore.no-password.jks";
+    protected static final String TRUSTSTORE_PASSWORD = "";
+    protected static final KeystoreType TRUSTSTORE_TYPE = KeystoreType.JKS;
+
+    private static final String KEYSTORE_PATH = 
"src/test/resources/keystore.jks";
+    private static final String KEYSTORE_PASSWORD = "passwordpassword";
+    private static final KeystoreType KEYSTORE_TYPE = KeystoreType.JKS;
+
+    private static final String HTTP_CONNECT_TIMEOUT = "30 s";
+    private static final String HTTP_READ_TIMEOUT = "30 s";
+
+    protected static final TlsConfiguration SERVER_CONFIGURATION = new 
StandardTlsConfiguration(
+            KEYSTORE_PATH,
+            KEYSTORE_PASSWORD,
+            KEYSTORE_TYPE,
+            TRUSTSTORE_PATH,
+            TRUSTSTORE_PASSWORD,
+            TRUSTSTORE_TYPE
+    );
+
+    protected static SSLContext clientSslContext;
+
+    private static final TlsConfiguration CLIENT_CONFIGURATION = new 
StandardTlsConfiguration(
+            null,
+            null,
+            null,
+            TRUSTSTORE_PATH,
+            TRUSTSTORE_PASSWORD,
+            TRUSTSTORE_TYPE
+    );
 
     @BeforeClass
     public static void beforeClass() throws Exception {
-        Assume.assumeTrue("Test only runs on *nix", 
!SystemUtils.IS_OS_WINDOWS);
-        // useful for verbose logging output
-        // don't commit this with this property enabled, or any 'mvn test' 
will be really verbose
-        // 
System.setProperty("org.slf4j.simpleLogger.log.nifi.processors.standard", 
"debug");
-
-        // create the SSL properties, which basically store keystore / 
truststore information
-        // this is used by the StandardSSLContextService and the Jetty Server
-        serverSslProperties = createServerSslProperties(false);
-        sslProperties = createClientSslProperties(false);
-
-        // create a Jetty server on a random port
-        server = createServer();
-        server.startServer();
-
-        // Allow time for the server to start
-        Thread.sleep(500);
-        // this is the base url with the random port
-        url = server.getSecureUrl();
-    }
-
-    @AfterClass
-    public static void afterClass() throws Exception {
-        if(server != null) {
-            server.shutdownServer();
-        }
+        final SSLContext serverContext = 
SslContextFactory.createSslContext(SERVER_CONFIGURATION);
+        configureServer(serverContext, ClientAuth.NONE);
+        clientSslContext = 
SslContextFactory.createSslContext(CLIENT_CONFIGURATION);
     }
 
     @Before
     public void before() throws Exception {
-        runner = TestRunners.newTestRunner(InvokeHTTP.class);
-        final StandardSSLContextService sslService = new 
StandardSSLContextService();
-        runner.addControllerService("ssl-context", sslService, sslProperties);
-        runner.enableControllerService(sslService);
-        runner.setProperty(InvokeHTTP.PROP_SSL_CONTEXT_SERVICE, "ssl-context");
-
-        // Allow time for the controller service to fully initialize
-        Thread.sleep(500);
-
-        // Provide more time to setup and run
-        runner.setProperty(InvokeHTTP.PROP_READ_TIMEOUT, "30 secs");
-        runner.setProperty(InvokeHTTP.PROP_CONNECT_TIMEOUT, "30 secs");
+        final SSLContextService sslContextService = 
Mockito.mock(SSLContextService.class);
+        final String serviceIdentifier = SSLContextService.class.getName();
 
-        server.clearHandlers();
-    }
-
-    @After
-    public void after() {
-        runner.shutdown();
-    }
+        
Mockito.when(sslContextService.getIdentifier()).thenReturn(serviceIdentifier);
+        
Mockito.when(sslContextService.createContext()).thenReturn(clientSslContext);
+        
Mockito.when(sslContextService.createTlsConfiguration()).thenReturn(CLIENT_CONFIGURATION);
 
-    static TestServer createServer() throws IOException {
-        return new TestServer(serverSslProperties);
-    }
-
-    static Map<String, String> createServerSslProperties(boolean clientAuth) {
-        final Map<String, String> map = new HashMap<>();
-        // if requesting client auth then we must also provide a truststore
-        if (clientAuth) {
-            map.put(TestServer.NEED_CLIENT_AUTH, Boolean.toString(true));
-            map.putAll(getTruststoreProperties());
-        } else {
-            map.put(TestServer.NEED_CLIENT_AUTH, Boolean.toString(false));
-        }
-        // keystore is always required for the server SSL properties
-        map.putAll(getServerKeystoreProperties());
-
-        return map;
-    }
-
-
-    static Map<String, String> createClientSslProperties(boolean clientAuth) {
-        final Map<String, String> map = new HashMap<>();
-        // if requesting client auth then we must provide a keystore
-        if (clientAuth) {
-            map.putAll(getClientKeystoreProperties());
-        }
-        // truststore is always required for the client SSL properties
-        map.putAll(getTruststoreProperties());
-        return map;
-    }
-
-    private static Map<String, String> getServerKeystoreProperties() {
-        final Map<String, String> map = new HashMap<>();
-        map.put(StandardSSLContextService.KEYSTORE.getName(), 
"src/test/resources/keystore.jks");
-        map.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), 
"passwordpassword");
-        map.put(StandardSSLContextService.KEYSTORE_TYPE.getName(), "JKS");
-        return map;
-    }
-
-    private static Map<String, String> getClientKeystoreProperties() {
-        final Map<String, String> map = new HashMap<>();
-        map.put(StandardSSLContextService.KEYSTORE.getName(), 
"src/test/resources/client-keystore.p12");
-        map.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), 
"passwordpassword");
-        map.put(StandardSSLContextService.KEYSTORE_TYPE.getName(), "PKCS12");
-        return map;
-    }
+        runner = TestRunners.newTestRunner(InvokeHTTP.class);
+        runner.addControllerService(serviceIdentifier, sslContextService);
+        runner.enableControllerService(sslContextService);
 
-    private static Map<String, String> getTruststoreProperties() {
-        final Map<String, String> map = new HashMap<>();
-        map.put(StandardSSLContextService.TRUSTSTORE.getName(), 
"src/test/resources/truststore.no-password.jks");
-        // Commented this line to test passwordless truststores for NIFI-6770
-        // map.put(StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), 
"passwordpassword");
-        map.put(StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
-        return map;
+        runner.setProperty(InvokeHTTP.PROP_SSL_CONTEXT_SERVICE, 
serviceIdentifier);
+        runner.setProperty(InvokeHTTP.PROP_CONNECT_TIMEOUT, 
HTTP_CONNECT_TIMEOUT);
+        runner.setProperty(InvokeHTTP.PROP_READ_TIMEOUT, HTTP_READ_TIMEOUT);
     }
 }
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestInvokeHttpTwoWaySSL.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestInvokeHttpTwoWaySSL.java
index 4e500b9..6c3d71d 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestInvokeHttpTwoWaySSL.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestInvokeHttpTwoWaySSL.java
@@ -17,10 +17,15 @@
 
 package org.apache.nifi.processors.standard;
 
-import org.apache.commons.lang3.SystemUtils;
-import org.junit.Assume;
+import org.apache.nifi.security.util.ClientAuth;
+import org.apache.nifi.security.util.KeystoreType;
+import org.apache.nifi.security.util.SslContextFactory;
+import org.apache.nifi.security.util.StandardTlsConfiguration;
+import org.apache.nifi.security.util.TlsConfiguration;
 import org.junit.BeforeClass;
 
+import javax.net.ssl.SSLContext;
+
 /**
  * This is probably overkill but in keeping with the same pattern as the 
TestInvokeHttp and TestInvokeHttpSSL class,
  * we will execute the same tests using two-way SSL. The Jetty server created 
for these tests will require client
@@ -28,27 +33,23 @@ import org.junit.BeforeClass;
  */
 public class TestInvokeHttpTwoWaySSL extends TestInvokeHttpSSL {
 
+    private static final String CLIENT_KEYSTORE_PATH = 
"src/test/resources/client-keystore.p12";
+    private static final String CLIENT_KEYSTORE_PASSWORD = "passwordpassword";
+    private static final KeystoreType CLIENT_KEYSTORE_TYPE = 
KeystoreType.PKCS12;
+
+    private static final TlsConfiguration CLIENT_CONFIGURATION = new 
StandardTlsConfiguration(
+            CLIENT_KEYSTORE_PATH,
+            CLIENT_KEYSTORE_PASSWORD,
+            CLIENT_KEYSTORE_TYPE,
+            TRUSTSTORE_PATH,
+            TRUSTSTORE_PASSWORD,
+            TRUSTSTORE_TYPE
+    );
 
     @BeforeClass
     public static void beforeClass() throws Exception {
-        Assume.assumeTrue("Test only runs on *nix", 
!SystemUtils.IS_OS_WINDOWS);
-        // useful for verbose logging output
-        // don't commit this with this property enabled, or any 'mvn test' 
will be really verbose
-        // 
System.setProperty("org.slf4j.simpleLogger.log.nifi.processors.standard", 
"debug");
-
-        // create the SSL properties, which basically store keystore / 
trustore information
-        // this is used by the StandardSSLContextService and the Jetty Server
-        serverSslProperties = createServerSslProperties(true);
-        sslProperties = createClientSslProperties(true);
-
-        // create a Jetty server on a random port
-        server = createServer();
-        server.startServer();
-
-        // Allow time for the server to start
-        Thread.sleep(500);
-        // this is the base url with the random port
-        url = server.getSecureUrl();
+        final SSLContext serverContext = 
SslContextFactory.createSslContext(SERVER_CONFIGURATION);
+        configureServer(serverContext, ClientAuth.REQUIRED);
+        clientSslContext = 
SslContextFactory.createSslContext(CLIENT_CONFIGURATION);
     }
-
 }
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenHTTP.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenHTTP.java
index f819a28..31f706d 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenHTTP.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestListenHTTP.java
@@ -29,6 +29,8 @@ import java.io.DataOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.net.HttpURLConnection;
+import java.net.InetSocketAddress;
+import java.net.Socket;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
@@ -41,6 +43,7 @@ import javax.net.ssl.SSLHandshakeException;
 import javax.net.ssl.SSLSession;
 import javax.net.ssl.SSLSocket;
 import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
 import javax.servlet.http.HttpServletResponse;
 import okhttp3.MediaType;
 import okhttp3.MultipartBody;
@@ -48,7 +51,7 @@ import okhttp3.OkHttpClient;
 import okhttp3.Request;
 import okhttp3.RequestBody;
 import okhttp3.Response;
-import org.apache.commons.lang3.SystemUtils;
+
 import org.apache.nifi.processor.ProcessContext;
 import org.apache.nifi.processor.ProcessSessionFactory;
 import org.apache.nifi.remote.io.socket.NetworkUtils;
@@ -58,8 +61,8 @@ import org.apache.nifi.security.util.SslContextFactory;
 import org.apache.nifi.security.util.StandardTlsConfiguration;
 import org.apache.nifi.security.util.TlsConfiguration;
 import org.apache.nifi.security.util.TlsException;
+import org.apache.nifi.ssl.RestrictedSSLContextService;
 import org.apache.nifi.ssl.SSLContextService;
-import org.apache.nifi.ssl.StandardRestrictedSSLContextService;
 import org.apache.nifi.ssl.StandardSSLContextService;
 import org.apache.nifi.util.MockFlowFile;
 import org.apache.nifi.util.TestRunner;
@@ -70,6 +73,7 @@ import org.junit.Assume;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.mockito.Mockito;
 
 public class TestListenHTTP {
 
@@ -86,18 +90,57 @@ public class TestListenHTTP {
 
     private static final String KEYSTORE = "src/test/resources/keystore.jks";
     private static final String KEYSTORE_PASSWORD = "passwordpassword";
+    private static final KeystoreType KEYSTORE_TYPE = KeystoreType.JKS;
     private static final String TRUSTSTORE = 
"src/test/resources/truststore.jks";
     private static final String TRUSTSTORE_PASSWORD = "passwordpassword";
-    private static final String TRUSTSTORE_TYPE = KeystoreType.JKS.getType();
+    private static final KeystoreType TRUSTSTORE_TYPE = KeystoreType.JKS;
     private static final String CLIENT_KEYSTORE = 
"src/test/resources/client-keystore.p12";
-    private static final String CLIENT_KEYSTORE_TYPE = 
KeystoreType.PKCS12.getType();
+    private static final KeystoreType CLIENT_KEYSTORE_TYPE = 
KeystoreType.PKCS12;
 
     private static final String TLS_1_3 = "TLSv1.3";
     private static final String TLS_1_2 = "TLSv1.2";
     private static final String LOCALHOST = "localhost";
 
-    private static TlsConfiguration clientTlsConfiguration;
-    private static TlsConfiguration trustOnlyTlsConfiguration;
+    private static final long SEND_REQUEST_SLEEP = 150;
+    private static final long RESPONSE_TIMEOUT = 1200000;
+    private static final int SOCKET_CONNECT_TIMEOUT = 100;
+    private static final long SERVER_START_TIMEOUT = 1200000;
+
+    private static final TlsConfiguration SERVER_CONFIGURATION = new 
StandardTlsConfiguration(
+            KEYSTORE,
+            KEYSTORE_PASSWORD,
+            KEYSTORE_PASSWORD,
+            KEYSTORE_TYPE,
+            TRUSTSTORE,
+            TRUSTSTORE_PASSWORD,
+            TRUSTSTORE_TYPE,
+            TLS_1_2
+    );
+    private static final TlsConfiguration SERVER_TLS_1_3_CONFIGURATION = new 
StandardTlsConfiguration(
+            KEYSTORE,
+            KEYSTORE_PASSWORD,
+            KEYSTORE_PASSWORD,
+            KEYSTORE_TYPE,
+            TRUSTSTORE,
+            TRUSTSTORE_PASSWORD,
+            TRUSTSTORE_TYPE,
+            TLS_1_3
+    );
+    private static final TlsConfiguration SERVER_NO_TRUSTSTORE_CONFIGURATION = 
new StandardTlsConfiguration(
+            KEYSTORE,
+            KEYSTORE_PASSWORD,
+            KEYSTORE_PASSWORD,
+            KEYSTORE_TYPE,
+            null,
+            null,
+            null,
+            TLS_1_2
+    );
+    private static SSLContext serverKeyStoreSslContext;
+    private static SSLContext serverKeyStoreNoTrustStoreSslContext;
+
+    private static SSLContext keyStoreSslContext;
+    private static SSLContext trustStoreSslContext;
 
     private ListenHTTP proc;
     private TestRunner runner;
@@ -105,8 +148,27 @@ public class TestListenHTTP {
     private int availablePort;
 
     @BeforeClass
-    public static void setUpSuite() {
-        Assume.assumeTrue("Test only runs on *nix", 
!SystemUtils.IS_OS_WINDOWS);
+    public static void setUpSuite() throws TlsException {
+        serverKeyStoreSslContext = 
SslContextFactory.createSslContext(SERVER_CONFIGURATION);
+        final TrustManager[] defaultTrustManagers = 
SslContextFactory.getTrustManagers(SERVER_NO_TRUSTSTORE_CONFIGURATION);
+        serverKeyStoreNoTrustStoreSslContext = 
SslContextFactory.createSslContext(SERVER_NO_TRUSTSTORE_CONFIGURATION, 
defaultTrustManagers);
+
+        keyStoreSslContext = SslContextFactory.createSslContext(new 
StandardTlsConfiguration(
+                CLIENT_KEYSTORE,
+                KEYSTORE_PASSWORD,
+                CLIENT_KEYSTORE_TYPE,
+                TRUSTSTORE,
+                TRUSTSTORE_PASSWORD,
+                TRUSTSTORE_TYPE)
+        );
+        trustStoreSslContext = SslContextFactory.createSslContext(new 
StandardTlsConfiguration(
+                null,
+                null,
+                null,
+                TRUSTSTORE,
+                TRUSTSTORE_PASSWORD,
+                TRUSTSTORE_TYPE)
+        );
     }
 
     @Before
@@ -116,11 +178,6 @@ public class TestListenHTTP {
         availablePort = NetworkUtils.availablePort();
         runner.setVariable(PORT_VARIABLE, Integer.toString(availablePort));
         runner.setVariable(BASEPATH_VARIABLE, HTTP_BASE_PATH);
-
-        clientTlsConfiguration = new StandardTlsConfiguration(CLIENT_KEYSTORE, 
KEYSTORE_PASSWORD, null, CLIENT_KEYSTORE_TYPE,
-                TRUSTSTORE, TRUSTSTORE_PASSWORD, TRUSTSTORE_TYPE, 
TlsConfiguration.getHighestCurrentSupportedTlsProtocolVersion());
-        trustOnlyTlsConfiguration = new StandardTlsConfiguration(null, null, 
null, null,
-                TRUSTSTORE, TRUSTSTORE_PASSWORD, TRUSTSTORE_TYPE, 
TlsConfiguration.getHighestCurrentSupportedTlsProtocolVersion());
     }
 
     @After
@@ -167,9 +224,7 @@ public class TestListenHTTP {
 
     @Test
     public void testSecurePOSTRequestsReceivedWithoutEL() throws Exception {
-        SSLContextService sslContextService = 
configureProcessorSslContextService(false);
-        runner.setProperty(sslContextService, 
StandardRestrictedSSLContextService.RESTRICTED_SSL_ALGORITHM, 
TlsConfiguration.getHighestCurrentSupportedTlsProtocolVersion());
-        runner.enableControllerService(sslContextService);
+        
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.AUTO, 
SERVER_NO_TRUSTSTORE_CONFIGURATION);
 
         runner.setProperty(ListenHTTP.PORT, Integer.toString(availablePort));
         runner.setProperty(ListenHTTP.BASE_PATH, HTTP_BASE_PATH);
@@ -180,9 +235,7 @@ public class TestListenHTTP {
 
     @Test
     public void testSecurePOSTRequestsReturnCodeReceivedWithoutEL() throws 
Exception {
-        SSLContextService sslContextService = 
configureProcessorSslContextService(false);
-        runner.setProperty(sslContextService, 
StandardRestrictedSSLContextService.RESTRICTED_SSL_ALGORITHM, 
TlsConfiguration.getHighestCurrentSupportedTlsProtocolVersion());
-        runner.enableControllerService(sslContextService);
+        
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.AUTO, 
SERVER_NO_TRUSTSTORE_CONFIGURATION);
 
         runner.setProperty(ListenHTTP.PORT, Integer.toString(availablePort));
         runner.setProperty(ListenHTTP.BASE_PATH, HTTP_BASE_PATH);
@@ -194,9 +247,7 @@ public class TestListenHTTP {
 
     @Test
     public void testSecurePOSTRequestsReceivedWithEL() throws Exception {
-        SSLContextService sslContextService = 
configureProcessorSslContextService(false);
-        runner.setProperty(sslContextService, 
StandardRestrictedSSLContextService.RESTRICTED_SSL_ALGORITHM, 
TlsConfiguration.getHighestCurrentSupportedTlsProtocolVersion());
-        runner.enableControllerService(sslContextService);
+        
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.AUTO, 
SERVER_NO_TRUSTSTORE_CONFIGURATION);
 
         runner.setProperty(ListenHTTP.PORT, HTTP_SERVER_PORT_EL);
         runner.setProperty(ListenHTTP.BASE_PATH, HTTP_SERVER_BASEPATH_EL);
@@ -207,9 +258,7 @@ public class TestListenHTTP {
 
     @Test
     public void testSecurePOSTRequestsReturnCodeReceivedWithEL() throws 
Exception {
-        SSLContextService sslContextService = 
configureProcessorSslContextService(false);
-        runner.setProperty(sslContextService, 
StandardRestrictedSSLContextService.RESTRICTED_SSL_ALGORITHM, 
TlsConfiguration.getHighestCurrentSupportedTlsProtocolVersion());
-        runner.enableControllerService(sslContextService);
+        
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.AUTO, 
SERVER_NO_TRUSTSTORE_CONFIGURATION);
 
         runner.setProperty(ListenHTTP.PORT, Integer.toString(availablePort));
         runner.setProperty(ListenHTTP.BASE_PATH, HTTP_BASE_PATH);
@@ -221,9 +270,7 @@ public class TestListenHTTP {
 
     @Test
     public void testSecureTwoWaySslPOSTRequestsReceivedWithoutEL() throws 
Exception {
-        SSLContextService sslContextService = 
configureProcessorSslContextService(true);
-        runner.setProperty(sslContextService, 
StandardRestrictedSSLContextService.RESTRICTED_SSL_ALGORITHM, 
TlsConfiguration.getHighestCurrentSupportedTlsProtocolVersion());
-        runner.enableControllerService(sslContextService);
+        
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.REQUIRED, 
SERVER_CONFIGURATION);
 
         runner.setProperty(ListenHTTP.PORT, Integer.toString(availablePort));
         runner.setProperty(ListenHTTP.BASE_PATH, HTTP_BASE_PATH);
@@ -234,9 +281,7 @@ public class TestListenHTTP {
 
     @Test
     public void testSecureTwoWaySslPOSTRequestsReturnCodeReceivedWithoutEL() 
throws Exception {
-        SSLContextService sslContextService = 
configureProcessorSslContextService(true);
-        runner.setProperty(sslContextService, 
StandardRestrictedSSLContextService.RESTRICTED_SSL_ALGORITHM, 
TlsConfiguration.getHighestCurrentSupportedTlsProtocolVersion());
-        runner.enableControllerService(sslContextService);
+        
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.REQUIRED, 
SERVER_CONFIGURATION);
 
         runner.setProperty(ListenHTTP.PORT, Integer.toString(availablePort));
         runner.setProperty(ListenHTTP.BASE_PATH, HTTP_BASE_PATH);
@@ -248,9 +293,7 @@ public class TestListenHTTP {
 
     @Test
     public void testSecureTwoWaySslPOSTRequestsReceivedWithEL() throws 
Exception {
-        SSLContextService sslContextService = 
configureProcessorSslContextService(true);
-        runner.setProperty(sslContextService, 
StandardRestrictedSSLContextService.RESTRICTED_SSL_ALGORITHM, 
TlsConfiguration.getHighestCurrentSupportedTlsProtocolVersion());
-        runner.enableControllerService(sslContextService);
+        
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.REQUIRED, 
SERVER_CONFIGURATION);
 
         runner.setProperty(ListenHTTP.PORT, HTTP_SERVER_PORT_EL);
         runner.setProperty(ListenHTTP.BASE_PATH, HTTP_SERVER_BASEPATH_EL);
@@ -261,9 +304,7 @@ public class TestListenHTTP {
 
     @Test
     public void testSecureTwoWaySslPOSTRequestsReturnCodeReceivedWithEL() 
throws Exception {
-        SSLContextService sslContextService = 
configureProcessorSslContextService(true);
-        runner.setProperty(sslContextService, 
StandardRestrictedSSLContextService.RESTRICTED_SSL_ALGORITHM, 
TlsConfiguration.getHighestCurrentSupportedTlsProtocolVersion());
-        runner.enableControllerService(sslContextService);
+        
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.REQUIRED, 
SERVER_CONFIGURATION);
 
         runner.setProperty(ListenHTTP.PORT, Integer.toString(availablePort));
         runner.setProperty(ListenHTTP.BASE_PATH, HTTP_BASE_PATH);
@@ -276,7 +317,6 @@ public class TestListenHTTP {
     @Test
     public void testSecureInvalidSSLConfiguration() throws Exception {
         SSLContextService sslContextService = 
configureInvalidProcessorSslContextService();
-        runner.setProperty(sslContextService, 
StandardSSLContextService.SSL_ALGORITHM, 
TlsConfiguration.getHighestCurrentSupportedTlsProtocolVersion());
         runner.enableControllerService(sslContextService);
 
         runner.setProperty(ListenHTTP.PORT, HTTP_SERVER_PORT_EL);
@@ -286,11 +326,12 @@ public class TestListenHTTP {
 
     @Test
     public void testSecureServerSupportsCurrentTlsProtocolVersion() throws 
Exception {
-        startSecureServer(false);
+        
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.AUTO, 
SERVER_NO_TRUSTSTORE_CONFIGURATION);
+        startSecureServer();
 
-        final SSLSocketFactory sslSocketFactory = 
SslContextFactory.createSSLSocketFactory(trustOnlyTlsConfiguration);
+        final SSLSocketFactory sslSocketFactory = 
trustStoreSslContext.getSocketFactory();
         final SSLSocket sslSocket = (SSLSocket) 
sslSocketFactory.createSocket(LOCALHOST, availablePort);
-        final String currentProtocol = 
TlsConfiguration.getHighestCurrentSupportedTlsProtocolVersion();
+        final String currentProtocol = 
SERVER_NO_TRUSTSTORE_CONFIGURATION.getProtocol();
         sslSocket.setEnabledProtocols(new String[]{currentProtocol});
 
         sslSocket.startHandshake();
@@ -300,19 +341,21 @@ public class TestListenHTTP {
 
     @Test
     public void 
testSecureServerTrustStoreConfiguredClientAuthenticationRequired() throws 
Exception {
-        startSecureServer(true);
-        final HttpsURLConnection connection = 
getSecureConnection(trustOnlyTlsConfiguration);
+        
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.REQUIRED, 
SERVER_CONFIGURATION);
+        startSecureServer();
+        final HttpsURLConnection connection = 
getSecureConnection(trustStoreSslContext);
         assertThrows(SSLException.class, connection::getResponseCode);
 
-        final HttpsURLConnection clientCertificateConnection = 
getSecureConnection(clientTlsConfiguration);
+        final HttpsURLConnection clientCertificateConnection = 
getSecureConnection(keyStoreSslContext);
         final int responseCode = clientCertificateConnection.getResponseCode();
         assertEquals(HttpServletResponse.SC_METHOD_NOT_ALLOWED, responseCode);
     }
 
     @Test
     public void 
testSecureServerTrustStoreNotConfiguredClientAuthenticationNotRequired() throws 
Exception {
-        startSecureServer(false);
-        final HttpsURLConnection connection = 
getSecureConnection(trustOnlyTlsConfiguration);
+        
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.AUTO, 
SERVER_NO_TRUSTSTORE_CONFIGURATION);
+        startSecureServer();
+        final HttpsURLConnection connection = 
getSecureConnection(trustStoreSslContext);
         final int responseCode = connection.getResponseCode();
         assertEquals(HttpServletResponse.SC_METHOD_NOT_ALLOWED, responseCode);
     }
@@ -323,9 +366,7 @@ public class TestListenHTTP {
         final String protocolMessage = String.format("TLS Protocol required 
[%s] found [%s]", TLS_1_3, currentProtocol);
         Assume.assumeTrue(protocolMessage, TLS_1_3.equals(currentProtocol));
 
-        final SSLContextService sslContextService = 
configureProcessorSslContextService(false);
-        runner.setProperty(sslContextService, 
StandardSSLContextService.SSL_ALGORITHM, TLS_1_3);
-        runner.enableControllerService(sslContextService);
+        
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.AUTO, 
SERVER_TLS_1_3_CONFIGURATION);
 
         runner.setProperty(ListenHTTP.PORT, Integer.toString(availablePort));
         runner.setProperty(ListenHTTP.BASE_PATH, HTTP_BASE_PATH);
@@ -333,18 +374,14 @@ public class TestListenHTTP {
         runner.assertValid();
 
         startWebServer();
-        final SSLSocketFactory sslSocketFactory = 
SslContextFactory.createSSLSocketFactory(trustOnlyTlsConfiguration);
+        final SSLSocketFactory sslSocketFactory = 
trustStoreSslContext.getSocketFactory();
         final SSLSocket sslSocket = (SSLSocket) 
sslSocketFactory.createSocket(LOCALHOST, availablePort);
         sslSocket.setEnabledProtocols(new String[]{TLS_1_2});
 
         assertThrows(SSLHandshakeException.class, sslSocket::startHandshake);
     }
 
-    private void startSecureServer(final boolean 
setServerTrustStoreProperties) throws InitializationException {
-        final SSLContextService sslContextService = 
configureProcessorSslContextService(ListenHTTP.ClientAuthentication.AUTO, 
setServerTrustStoreProperties);
-        runner.setProperty(sslContextService, 
StandardSSLContextService.SSL_ALGORITHM, TlsConfiguration.TLS_PROTOCOL);
-        runner.enableControllerService(sslContextService);
-
+    private void startSecureServer() {
         runner.setProperty(ListenHTTP.PORT, Integer.toString(availablePort));
         runner.setProperty(ListenHTTP.BASE_PATH, HTTP_BASE_PATH);
         runner.setProperty(ListenHTTP.RETURN_CODE, 
Integer.toString(HttpServletResponse.SC_NO_CONTENT));
@@ -352,11 +389,10 @@ public class TestListenHTTP {
         startWebServer();
     }
 
-    private HttpsURLConnection getSecureConnection(final TlsConfiguration 
tlsConfiguration) throws Exception {
+    private HttpsURLConnection getSecureConnection(final SSLContext 
sslContext) throws Exception {
         final URL url = new URL(buildUrl(true));
         final HttpsURLConnection connection = (HttpsURLConnection) 
url.openConnection();
-        final SSLSocketFactory sslSocketFactory = 
SslContextFactory.createSSLSocketFactory(tlsConfiguration);
-        connection.setSSLSocketFactory(sslSocketFactory);
+        connection.setSSLSocketFactory(sslContext.getSocketFactory());
         return connection;
     }
 
@@ -383,18 +419,16 @@ public class TestListenHTTP {
         return connection.getResponseCode();
     }
 
-    private static HttpsURLConnection buildSecureConnection(boolean twoWaySsl, 
URL url) throws IOException, TlsException {
-        final HttpsURLConnection sslCon = (HttpsURLConnection) 
url.openConnection();
-        SSLContext clientSslContext;
+    private static HttpsURLConnection buildSecureConnection(boolean twoWaySsl, 
URL url) throws IOException {
+        final HttpsURLConnection connection = (HttpsURLConnection) 
url.openConnection();
         if (twoWaySsl) {
             // Use a client certificate, do not reuse the server's keystore
-            clientSslContext = 
SslContextFactory.createSslContext(clientTlsConfiguration);
+            
connection.setSSLSocketFactory(keyStoreSslContext.getSocketFactory());
         } else {
             // With one-way SSL, the client still needs a truststore
-            clientSslContext = 
SslContextFactory.createSslContext(trustOnlyTlsConfiguration);
+            
connection.setSSLSocketFactory(trustStoreSslContext.getSocketFactory());
         }
-        sslCon.setSSLSocketFactory(clientSslContext.getSocketFactory());
-        return sslCon;
+        return connection;
     }
 
     private String buildUrl(final boolean secure) {
@@ -423,21 +457,45 @@ public class TestListenHTTP {
         final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
         final ProcessContext context = runner.getProcessContext();
         proc.onTrigger(context, processSessionFactory);
+
+        final int port = 
context.getProperty(ListenHTTP.PORT).evaluateAttributeExpressions().asInteger();
+        final InetSocketAddress socketAddress = new 
InetSocketAddress(LOCALHOST, port);
+        final Socket socket = new Socket();
+        boolean connected = false;
+        long elapsed = 0;
+
+        while (!connected && elapsed < SERVER_START_TIMEOUT) {
+            final long started = System.currentTimeMillis();
+            try {
+                socket.connect(socketAddress, SOCKET_CONNECT_TIMEOUT);
+                connected = true;
+                runner.getLogger().debug("Server Socket Connected after {} 
ms", new Object[]{elapsed});
+                socket.close();
+            } catch (final Exception e) {
+                runner.getLogger().debug("Server Socket Connect Failed: [{}] 
{}", new Object[]{e.getClass(), e.getMessage()});
+            }
+            final long connectElapsed = System.currentTimeMillis() - started;
+            elapsed += connectElapsed;
+        }
+
+        if (!connected) {
+            final String message = String.format("HTTP Server Port [%d] not 
listening after %d ms", port, SERVER_START_TIMEOUT);
+            throw new IllegalStateException(message);
+        }
     }
 
     private void startWebServerAndSendRequests(Runnable 
sendRequestToWebserver, int numberOfExpectedFlowFiles) throws Exception {
         startWebServer();
         new Thread(sendRequestToWebserver).start();
-        long responseTimeout = 10000;
 
         final ProcessSessionFactory processSessionFactory = 
runner.getProcessSessionFactory();
         final ProcessContext context = runner.getProcessContext();
         int numTransferred = 0;
         long startTime = System.currentTimeMillis();
-        while (numTransferred < numberOfExpectedFlowFiles && 
(System.currentTimeMillis() - startTime < responseTimeout)) {
+        while (numTransferred < numberOfExpectedFlowFiles && 
(System.currentTimeMillis() - startTime < RESPONSE_TIMEOUT)) {
             proc.onTrigger(context, processSessionFactory);
             numTransferred = 
runner.getFlowFilesForRelationship(RELATIONSHIP_SUCCESS).size();
-            Thread.sleep(100);
+            Thread.sleep(SEND_REQUEST_SLEEP);
         }
 
         runner.assertTransferCount(ListenHTTP.RELATIONSHIP_SUCCESS, 
numberOfExpectedFlowFiles);
@@ -462,33 +520,23 @@ public class TestListenHTTP {
         startWebServerAndSendRequests(sendMessagesToWebServer, 
messages.size());
     }
 
-    private SSLContextService configureProcessorSslContextService(boolean 
setTrustStoreProperties) throws InitializationException {
-        ListenHTTP.ClientAuthentication clientAuthentication = 
ListenHTTP.ClientAuthentication.AUTO;
-        if (setTrustStoreProperties) {
-            clientAuthentication = ListenHTTP.ClientAuthentication.REQUIRED;
-        }
-        return configureProcessorSslContextService(clientAuthentication, 
setTrustStoreProperties);
-    }
+    private void configureProcessorSslContextService(final 
ListenHTTP.ClientAuthentication clientAuthentication,
+                                                                  final 
TlsConfiguration tlsConfiguration) throws InitializationException {
+        final RestrictedSSLContextService sslContextService = 
Mockito.mock(RestrictedSSLContextService.class);
+        
Mockito.when(sslContextService.getIdentifier()).thenReturn(SSL_CONTEXT_SERVICE_IDENTIFIER);
+        
Mockito.when(sslContextService.createTlsConfiguration()).thenReturn(tlsConfiguration);
 
-    private SSLContextService configureProcessorSslContextService(final 
ListenHTTP.ClientAuthentication clientAuthentication,
-                                                                  final 
boolean setTrustStoreProperties) throws InitializationException {
-        final SSLContextService sslContextService = new 
StandardRestrictedSSLContextService();
+        if 
(ListenHTTP.ClientAuthentication.REQUIRED.equals(clientAuthentication)) {
+            
Mockito.when(sslContextService.createContext()).thenReturn(serverKeyStoreSslContext);
+        } else {
+            
Mockito.when(sslContextService.createContext()).thenReturn(serverKeyStoreNoTrustStoreSslContext);
+        }
         runner.addControllerService(SSL_CONTEXT_SERVICE_IDENTIFIER, 
sslContextService);
 
-        if (setTrustStoreProperties) {
-            runner.setProperty(sslContextService, 
StandardSSLContextService.TRUSTSTORE, TRUSTSTORE);
-            runner.setProperty(sslContextService, 
StandardSSLContextService.TRUSTSTORE_PASSWORD, TRUSTSTORE_PASSWORD);
-            runner.setProperty(sslContextService, 
StandardSSLContextService.TRUSTSTORE_TYPE, KeystoreType.JKS.getType());
-        }
         runner.setProperty(ListenHTTP.CLIENT_AUTHENTICATION, 
clientAuthentication.name());
-
-        runner.setProperty(sslContextService, 
StandardSSLContextService.KEYSTORE, KEYSTORE);
-        runner.setProperty(sslContextService, 
StandardSSLContextService.KEYSTORE_PASSWORD, TRUSTSTORE_PASSWORD);
-        runner.setProperty(sslContextService, 
StandardSSLContextService.KEYSTORE_TYPE, KeystoreType.JKS.getType());
-
         runner.setProperty(ListenHTTP.SSL_CONTEXT_SERVICE, 
SSL_CONTEXT_SERVICE_IDENTIFIER);
 
-        return sslContextService;
+        runner.enableControllerService(sslContextService);
     }
 
     private SSLContextService configureInvalidProcessorSslContextService() 
throws InitializationException {
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTCP.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTCP.java
index 2d5254c..e520711 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTCP.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTCP.java
@@ -22,7 +22,6 @@ public class TestPutTCP extends TestPutTCPCommon {
 
     public TestPutTCP() {
         super();
-        ssl = false;
     }
 
     @Override
@@ -41,6 +40,4 @@ public class TestPutTCP extends TestPutTCPCommon {
             runner.assertNotValid();
         }
     }
-
-
 }
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTcpSSL.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTcpSSL.java
index 154b40f..6870ae9 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTcpSSL.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestPutTcpSSL.java
@@ -16,23 +16,42 @@
  */
 package org.apache.nifi.processors.standard;
 
-import java.util.HashMap;
-import java.util.Map;
 import org.apache.nifi.processors.standard.util.TestPutTCPCommon;
 import org.apache.nifi.reporting.InitializationException;
-import org.apache.nifi.ssl.StandardSSLContextService;
+import org.apache.nifi.security.util.KeystoreType;
+import org.apache.nifi.security.util.SslContextFactory;
+import org.apache.nifi.security.util.StandardTlsConfiguration;
+import org.apache.nifi.security.util.TlsConfiguration;
+import org.apache.nifi.security.util.TlsException;
+import org.apache.nifi.ssl.SSLContextService;
+import org.junit.BeforeClass;
+import org.mockito.Mockito;
+
+import javax.net.ssl.SSLContext;
 
 public class TestPutTcpSSL extends TestPutTCPCommon {
-    private static Map<String, String> sslProperties;
+    private static final String TLS_PROTOCOL = "TLSv1.2";
+
+    private static SSLContext sslContext;
 
-    // TODO: The NiFi SSL classes don't yet support TLSv1.3, so set the CS 
version explicitly
-    private static final String TLS_PROTOCOL_VERSION = "TLSv1.2";
+    @BeforeClass
+    public static void configureServices() throws TlsException {
+        final TlsConfiguration configuration = new StandardTlsConfiguration(
+                "src/test/resources/keystore.jks",
+                "passwordpassword",
+                "passwordpassword",
+                KeystoreType.JKS,
+                "src/test/resources/truststore.jks",
+                "passwordpassword",
+                KeystoreType.JKS,
+                TLS_PROTOCOL
+        );
+        sslContext = SslContextFactory.createSslContext(configuration);
+    }
 
     public TestPutTcpSSL() {
         super();
-        ssl = true;
-
-        sslProperties = createSslProperties();
+        serverSocketFactory = sslContext.getServerSocketFactory();
     }
 
     @Override
@@ -40,10 +59,14 @@ public class TestPutTcpSSL extends TestPutTCPCommon {
         runner.setProperty(PutTCP.HOSTNAME, host);
         runner.setProperty(PutTCP.PORT, Integer.toString(port));
 
-        final StandardSSLContextService sslService = new 
StandardSSLContextService();
-        runner.addControllerService("ssl-context", sslService, sslProperties);
-        runner.enableControllerService(sslService);
-        runner.setProperty(PutTCP.SSL_CONTEXT_SERVICE, "ssl-context");
+        final SSLContextService sslContextService = 
Mockito.mock(SSLContextService.class);
+        final String serviceIdentifier = SSLContextService.class.getName();
+        
Mockito.when(sslContextService.getIdentifier()).thenReturn(serviceIdentifier);
+        Mockito.when(sslContextService.createContext()).thenReturn(sslContext);
+
+        runner.addControllerService(serviceIdentifier, sslContextService);
+        runner.enableControllerService(sslContextService);
+        runner.setProperty(PutTCP.SSL_CONTEXT_SERVICE, serviceIdentifier);
 
         if (outgoingMessageDelimiter != null) {
             runner.setProperty(PutTCP.OUTGOING_MESSAGE_DELIMITER, 
outgoingMessageDelimiter);
@@ -56,16 +79,4 @@ public class TestPutTcpSSL extends TestPutTCPCommon {
             runner.assertNotValid();
         }
     }
-
-    private static Map<String, String> createSslProperties() {
-        final Map<String, String> map = new HashMap<>();
-        map.put(StandardSSLContextService.KEYSTORE.getName(), 
"src/test/resources/keystore.jks");
-        map.put(StandardSSLContextService.KEYSTORE_PASSWORD.getName(), 
"passwordpassword");
-        map.put(StandardSSLContextService.KEYSTORE_TYPE.getName(), "JKS");
-        map.put(StandardSSLContextService.TRUSTSTORE.getName(), 
"src/test/resources/truststore.jks");
-        map.put(StandardSSLContextService.TRUSTSTORE_PASSWORD.getName(), 
"passwordpassword");
-        map.put(StandardSSLContextService.TRUSTSTORE_TYPE.getName(), "JKS");
-        map.put(StandardSSLContextService.SSL_ALGORITHM.getName(), 
TLS_PROTOCOL_VERSION);
-        return map;
-    }
 }
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TCPTestServer.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TCPTestServer.java
index 6b79acb..46da31b 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TCPTestServer.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TCPTestServer.java
@@ -25,10 +25,6 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ArrayBlockingQueue;
 import javax.net.ServerSocketFactory;
-import javax.net.ssl.SSLContext;
-import org.apache.nifi.security.util.SslContextFactory;
-import org.apache.nifi.security.util.StandardTlsConfiguration;
-import org.apache.nifi.security.util.TlsConfiguration;
 
 public class TCPTestServer implements Runnable {
 
@@ -51,17 +47,12 @@ public class TCPTestServer implements Runnable {
         this.messageDelimiter = messageDelimiter;
     }
 
-    public synchronized void startServer(boolean ssl) throws Exception {
+    public synchronized void startServer(final ServerSocketFactory 
serverSocketFactory) throws Exception {
         if (!isServerRunning()) {
-            if(ssl){
-                TlsConfiguration tlsConfiguration = new 
StandardTlsConfiguration("src/test/resources/keystore.jks","passwordpassword", 
null, "JKS", "src/test/resources/truststore.jks",
-                        "passwordpassword", "JKS", 
TlsConfiguration.getHighestCurrentSupportedTlsProtocolVersion());
-                final SSLContext sslCtx = 
SslContextFactory.createSslContext(tlsConfiguration);
-
-                ServerSocketFactory sslSocketFactory = 
sslCtx.getServerSocketFactory();
-                serverSocket = sslSocketFactory.createServerSocket(0, 0, 
ipAddress);
-            } else {
+            if (serverSocketFactory == null) {
                 serverSocket = new ServerSocket(0, 0, ipAddress);
+            } else {
+                serverSocket = serverSocketFactory.createServerSocket(0, 0, 
ipAddress);
             }
             Thread t = new Thread(this);
             t.setName(this.getClass().getSimpleName());
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestInvokeHttpCommon.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestInvokeHttpCommon.java
index c11e4f3..b787e25 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestInvokeHttpCommon.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestInvokeHttpCommon.java
@@ -33,6 +33,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import javax.net.ssl.SSLContext;
 import javax.servlet.MultipartConfigElement;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
@@ -45,10 +46,12 @@ import org.apache.nifi.flowfile.attributes.CoreAttributes;
 import org.apache.nifi.processors.standard.InvokeHTTP;
 import org.apache.nifi.provenance.ProvenanceEventRecord;
 import org.apache.nifi.provenance.ProvenanceEventType;
+import org.apache.nifi.remote.io.socket.NetworkUtils;
+import org.apache.nifi.security.util.ClientAuth;
 import org.apache.nifi.util.MockFlowFile;
 import org.apache.nifi.util.StringUtils;
 import org.apache.nifi.util.TestRunner;
-import org.apache.nifi.web.util.TestServer;
+import org.apache.nifi.web.util.JettyServerUtils;
 import org.eclipse.jetty.http.MultiPartFormInputStream;
 import org.eclipse.jetty.security.ConstraintSecurityHandler;
 import org.eclipse.jetty.security.DefaultIdentityService;
@@ -58,20 +61,63 @@ import 
org.eclipse.jetty.security.authentication.DigestAuthenticator;
 import org.eclipse.jetty.server.Authentication;
 import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
 import org.eclipse.jetty.server.handler.AbstractHandler;
 import org.eclipse.jetty.util.MultiPartInputStreamParser;
+import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Test;
 
 public abstract class TestInvokeHttpCommon {
 
-    public static TestServer server;
-    public static String url;
+    protected static Server server;
 
-    public TestRunner runner;
+    protected static String url;
 
-    public void addHandler(Handler handler) {
-        server.addHandler(handler);
+    private static final long READ_TIMEOUT_SLEEP = 1000;
+
+    protected TestRunner runner;
+
+    protected static void configureServer(final SSLContext sslContext, final 
ClientAuth clientAuth) throws Exception {
+        final int port = NetworkUtils.availablePort();
+
+        final String protocol = sslContext == null ? "http" : "https";
+        setUrl(protocol, port);
+
+        final Server configuredServer = JettyServerUtils.createServer(port, 
sslContext, clientAuth);
+        final ServerConnector connector = new 
ServerConnector(configuredServer);
+        connector.setPort(port);
+
+        JettyServerUtils.startServer(configuredServer);
+        setServer(configuredServer);
+    }
+
+    private static void setUrl(final String scheme, final int port) {
+        url = String.format("%s://localhost:%d", scheme, port);
+    }
+
+    private static void setServer(final Server configuredServer) {
+        server = configuredServer;
+    }
+
+    protected static void addHandler(final Handler handler) {
+        JettyServerUtils.addHandler(server, handler);
+    }
+
+    @AfterClass
+    public static void afterClass() throws Exception {
+        if (server != null) {
+            server.stop();
+            server.destroy();
+        }
+    }
+
+    @After
+    public void after() {
+        JettyServerUtils.clearHandlers(server);
+        runner.shutdown();
     }
 
     @Test
@@ -84,6 +130,9 @@ public abstract class TestInvokeHttpCommon {
         createFlowFiles(runner);
         runner.run();
 
+        runner.assertTransferCount(InvokeHTTP.REL_SUCCESS_REQ, 1);
+        runner.assertTransferCount(InvokeHTTP.REL_RESPONSE, 1);
+
         // extract the date string sent to the server
         // and store it as a java.util.Date
         final SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy 
HH:mm:ss z", Locale.US);
@@ -100,7 +149,6 @@ public abstract class TestInvokeHttpCommon {
         if (diff > threshold) {
             fail("Difference (" + diff + ") was greater than threshold (" + 
threshold + ")");
         }
-        System.out.println("diff: " + diff);
     }
 
     @Test
@@ -773,7 +821,6 @@ public abstract class TestInvokeHttpCommon {
 
         createFlowFiles(runner);
 
-        //assertTrue(server.jetty.isRunning());
         runner.run();
         runner.assertTransferCount(InvokeHTTP.REL_SUCCESS_REQ, 0);
         runner.assertTransferCount(InvokeHTTP.REL_RESPONSE, 0);
@@ -1489,7 +1536,7 @@ public abstract class TestInvokeHttpCommon {
         addHandler(new ReadTimeoutHandler());
 
         runner.setProperty(InvokeHTTP.PROP_URL, url + "/status/200");
-        runner.setProperty(InvokeHTTP.PROP_READ_TIMEOUT, "5 secs");
+        runner.setProperty(InvokeHTTP.PROP_READ_TIMEOUT, String.format("%d 
ms", READ_TIMEOUT_SLEEP / 2));
 
         createFlowFiles(runner);
 
@@ -2020,7 +2067,7 @@ public abstract class TestInvokeHttpCommon {
 
             if ("Get".equalsIgnoreCase(request.getMethod())) {
                 try {
-                    Thread.sleep(10000);
+                    Thread.sleep(READ_TIMEOUT_SLEEP);
                 } catch (InterruptedException e) {
                     return;
                 }
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestPutTCPCommon.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestPutTCPCommon.java
index 5cf0e4a..b2a8eb7 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestPutTCPCommon.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/util/TestPutTCPCommon.java
@@ -30,6 +30,7 @@ import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 
+import javax.net.ServerSocketFactory;
 import java.net.InetAddress;
 import java.util.List;
 import java.util.concurrent.ArrayBlockingQueue;
@@ -59,7 +60,7 @@ public abstract class TestPutTCPCommon {
     private final static char CONTENT_CHAR = 'x';
     private final static int DATA_WAIT_PERIOD = 1000;
     private final static int DEFAULT_TEST_TIMEOUT_PERIOD = 10000;
-    private final static int LONG_TEST_TIMEOUT_PERIOD = 100000;
+    private final static int LONG_TEST_TIMEOUT_PERIOD = 180000;
     private final static String OUTGOING_MESSAGE_DELIMITER = "\n";
     private final static String OUTGOING_MESSAGE_DELIMITER_MULTI_CHAR = 
"{delimiter}\r\n";
 
@@ -67,7 +68,7 @@ public abstract class TestPutTCPCommon {
     private int tcp_server_port;
     private ArrayBlockingQueue<List<Byte>> recvQueue;
 
-    public boolean ssl;
+    public ServerSocketFactory serverSocketFactory;
     public TestRunner runner;
 
     // Test Data
@@ -88,7 +89,7 @@ public abstract class TestPutTCPCommon {
 
     private synchronized TCPTestServer createTestServer(final String address, 
final ArrayBlockingQueue<List<Byte>> recvQueue, final String delimiter) throws 
Exception {
         TCPTestServer server = new 
TCPTestServer(InetAddress.getByName(address), recvQueue, delimiter);
-        server.startServer(ssl);
+        server.startServer(serverSocketFactory);
         tcp_server_port = server.getPort();
         return server;
     }
@@ -136,8 +137,8 @@ public abstract class TestPutTCPCommon {
         checkReceivedAllData(recvQueue, VALID_FILES);
         checkInputQueueIsEmpty();
         checkTotalNumConnections(server, 1);
-        runner.setProperty(PutTCP.IDLE_EXPIRATION, "1 second");
-        Thread.sleep(2000);
+        runner.setProperty(PutTCP.IDLE_EXPIRATION, "100 ms");
+        Thread.sleep(200);
         runner.run(1, false, false);
         runner.clearTransferState();
         sendTestData(VALID_FILES);
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-web-test-utils/src/main/java/org/apache/nifi/web/util/JettyServerUtils.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-web-test-utils/src/main/java/org/apache/nifi/web/util/JettyServerUtils.java
new file mode 100644
index 0000000..23b1922
--- /dev/null
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-web-test-utils/src/main/java/org/apache/nifi/web/util/JettyServerUtils.java
@@ -0,0 +1,88 @@
+/*
+ * 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.nifi.web.util;
+
+import org.apache.nifi.security.util.ClientAuth;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.handler.HandlerCollection;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+
+import javax.net.ssl.SSLContext;
+
+public class JettyServerUtils {
+
+    private static final long IDLE_TIMEOUT = 60000;
+
+    private static final long SERVER_START_SLEEP = 100L;
+
+    public static Server createServer(final int port, final SSLContext 
sslContext, final ClientAuth clientAuth) {
+        final Server server = new Server();
+
+        final ServerConnector connector;
+        if (sslContext == null) {
+            connector = new ServerConnector(server);
+        } else {
+            final SslContextFactory.Server sslContextFactory = new 
SslContextFactory.Server();
+            sslContextFactory.setSslContext(sslContext);
+
+            if (ClientAuth.REQUIRED.equals(clientAuth)) {
+                sslContextFactory.setNeedClientAuth(true);
+            }
+
+            connector = new ServerConnector(server, sslContextFactory);
+        }
+
+        connector.setPort(port);
+        connector.setIdleTimeout(IDLE_TIMEOUT);
+        server.addConnector(connector);
+
+        final HandlerCollection handlerCollection = new 
HandlerCollection(true);
+        server.setHandler(handlerCollection);
+        return server;
+    }
+
+    public static void startServer(final Server server) throws Exception {
+        server.start();
+        while (!server.isStarted()) {
+            Thread.sleep(SERVER_START_SLEEP);
+        }
+    }
+
+    public static void addHandler(final Server server, final Handler handler) {
+        final Handler serverHandler = server.getHandler();
+        if (serverHandler instanceof HandlerCollection) {
+            final HandlerCollection handlerCollection = (HandlerCollection) 
serverHandler;
+            handlerCollection.addHandler(handler);
+        }
+    }
+
+    public static void clearHandlers(final Server server) {
+        final Handler serverHandler = server.getHandler();
+        if (serverHandler instanceof HandlerCollection) {
+            final HandlerCollection handlerCollection = (HandlerCollection) 
serverHandler;
+            final Handler[] handlers = handlerCollection.getHandlers();
+            if (handlers != null) {
+                for (final Handler handler : handlerCollection.getHandlers()) {
+                    handlerCollection.removeHandler(handler);
+                }
+            }
+
+        }
+    }
+}
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-web-test-utils/src/main/java/org/apache/nifi/web/util/TestServer.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-web-test-utils/src/main/java/org/apache/nifi/web/util/TestServer.java
index e691d6b..94be341 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-web-test-utils/src/main/java/org/apache/nifi/web/util/TestServer.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-web-test-utils/src/main/java/org/apache/nifi/web/util/TestServer.java
@@ -31,6 +31,8 @@ public class TestServer {
 
     public static final String NEED_CLIENT_AUTH = "clientAuth";
 
+    private static final long IDLE_TIMEOUT = 60000;
+
     private Server jetty;
     private boolean secure = false;
 
@@ -71,12 +73,12 @@ public class TestServer {
         final ServerConnector http = new ServerConnector(jetty);
         http.setPort(0);
         // Severely taxed environments may have significant delays when 
executing.
-        http.setIdleTimeout(30000L);
+        http.setIdleTimeout(IDLE_TIMEOUT);
         jetty.addConnector(http);
     }
 
     private void createSecureConnector(final Map<String, String> 
sslProperties) {
-        SslContextFactory ssl = new SslContextFactory.Server();
+        SslContextFactory.Server ssl = new SslContextFactory.Server();
 
         if (sslProperties.get(StandardSSLContextService.KEYSTORE.getName()) != 
null) {
             
ssl.setKeyStorePath(sslProperties.get(StandardSSLContextService.KEYSTORE.getName()));
@@ -103,7 +105,7 @@ public class TestServer {
         // set host and port
         https.setPort(0);
         // Severely taxed environments may have significant delays when 
executing.
-        https.setIdleTimeout(30000L);
+        https.setIdleTimeout(IDLE_TIMEOUT);
 
         // add the connector
         jetty.addConnector(https);
@@ -113,17 +115,11 @@ public class TestServer {
     }
 
     public void clearHandlers() {
-        HandlerCollection hc = (HandlerCollection) jetty.getHandler();
-        Handler[] ha = hc.getHandlers();
-        if (ha != null) {
-            for (Handler h : ha) {
-                hc.removeHandler(h);
-            }
-        }
+        JettyServerUtils.clearHandlers(jetty);
     }
 
-    public void addHandler(Handler handler) {
-        ((HandlerCollection) jetty.getHandler()).addHandler(handler);
+    public void addHandler(final Handler handler) {
+        JettyServerUtils.addHandler(jetty, handler);
     }
 
     public void startServer() throws Exception {
diff --git a/nifi-nar-bundles/nifi-standard-bundle/pom.xml 
b/nifi-nar-bundles/nifi-standard-bundle/pom.xml
index 605f940..c29a5f3 100644
--- a/nifi-nar-bundles/nifi-standard-bundle/pom.xml
+++ b/nifi-nar-bundles/nifi-standard-bundle/pom.xml
@@ -182,21 +182,6 @@
                 <version>3.9</version>
             </dependency>
             <dependency>
-                <groupId>org.bouncycastle</groupId>
-                <artifactId>bcprov-jdk15on</artifactId>
-                <version>1.66</version>
-            </dependency>
-            <dependency>
-                <groupId>org.bouncycastle</groupId>
-                <artifactId>bcpg-jdk15on</artifactId>
-                <version>1.66</version>
-            </dependency>
-            <dependency>
-                <groupId>org.bouncycastle</groupId>
-                <artifactId>bcpkix-jdk15on</artifactId>
-                <version>1.66</version>
-            </dependency>
-            <dependency>
                 <groupId>commons-codec</groupId>
                 <artifactId>commons-codec</artifactId>
                 <version>1.14</version>
diff --git a/nifi-toolkit/nifi-toolkit-tls/pom.xml 
b/nifi-toolkit/nifi-toolkit-tls/pom.xml
index 28ee575..6b0cb85 100644
--- a/nifi-toolkit/nifi-toolkit-tls/pom.xml
+++ b/nifi-toolkit/nifi-toolkit-tls/pom.xml
@@ -51,12 +51,10 @@
         <dependency>
             <groupId>org.bouncycastle</groupId>
             <artifactId>bcpkix-jdk15on</artifactId>
-            <version>1.66</version>
         </dependency>
         <dependency>
             <groupId>org.bouncycastle</groupId>
             <artifactId>bcprov-jdk15on</artifactId>
-            <version>1.66</version>
         </dependency>
         <dependency>
             <groupId>commons-cli</groupId>
diff --git a/pom.xml b/pom.xml
index 926f1f2..8b603e5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -88,6 +88,7 @@
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
         <inceptionYear>2014</inceptionYear>
+        <org.bouncycastle.version>1.68</org.bouncycastle.version>
         <org.slf4j.version>1.7.30</org.slf4j.version>
         <ranger.version>2.1.0</ranger.version>
         <jetty.version>9.4.35.v20201120</jetty.version>
@@ -261,6 +262,21 @@
                 <artifactId>slf4j-log4j12</artifactId>
                 <version>${org.slf4j.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.bouncycastle</groupId>
+                <artifactId>bcprov-jdk15on</artifactId>
+                <version>${org.bouncycastle.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.bouncycastle</groupId>
+                <artifactId>bcpkix-jdk15on</artifactId>
+                <version>${org.bouncycastle.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.bouncycastle</groupId>
+                <artifactId>bcpg-jdk15on</artifactId>
+                <version>${org.bouncycastle.version}</version>
+            </dependency>
 
             <!-- These junit/mockito/groovy/spock/hamcrest dependencies are 
here to encourage consistent unit test library usage -->
             <dependency>

Reply via email to