101101
102102import javax .annotation .concurrent .GuardedBy ;
103103import javax .net .ssl .SSLContext ;
104- import java .io .File ;
105- import java .io .IOException ;
106- import java .io .InterruptedIOException ;
107- import java .io .UncheckedIOException ;
104+ import javax .net .ssl .TrustManagerFactory ;
105+ import java .io .*;
108106import java .lang .management .ManagementFactory ;
109107import java .lang .management .MemoryMXBean ;
110108import java .lang .management .MemoryUsage ;
111109import java .lang .reflect .InvocationTargetException ;
112110import java .lang .reflect .Method ;
113111import java .net .URI ;
114112import java .nio .channels .ClosedByInterruptException ;
113+ import java .security .KeyStore ;
115114import java .security .NoSuchAlgorithmException ;
116115import java .text .ParseException ;
117116import java .text .SimpleDateFormat ;
@@ -432,6 +431,34 @@ public abstract class ModelMesh extends ThriftService
432431 }
433432 }
434433
434+ private static final String SSL_TRUSTSTORE_PATH_PROPERTY = "watson.ssl.truststore.path" ;
435+ private static final String SSL_TRUSTSTORE_PASSWORD_PROPERTY = "watson.ssl.truststore.password" ;
436+
437+ private static SSLContext sslContext = null ;
438+
439+ private static SSLContext loadSSLContext () throws Exception {
440+ if (sslContext == null ) {
441+ final String trustStorePath = System .getProperty (SSL_TRUSTSTORE_PATH_PROPERTY );
442+ final String trustStorePassword = System .getProperty (SSL_TRUSTSTORE_PASSWORD_PROPERTY );
443+
444+ if (trustStorePath == null || trustStorePassword == null ) {
445+ throw new IllegalArgumentException ("Truststore settings not found in system properties" );
446+ }
447+
448+ final KeyStore trustStore = KeyStore .getInstance ("JKS" );
449+ try (FileInputStream trustStoreStream = new FileInputStream (trustStorePath )) {
450+ trustStore .load (trustStoreStream , trustStorePassword .toCharArray ());
451+ }
452+
453+ final TrustManagerFactory trustManagerFactory = TrustManagerFactory .getInstance (TrustManagerFactory .getDefaultAlgorithm ());
454+ trustManagerFactory .init (trustStore );
455+
456+ sslContext = SSLContext .getInstance ("TLS" );
457+ sslContext .init (null , trustManagerFactory .getTrustManagers (), null );
458+ }
459+ return sslContext ;
460+ }
461+
435462 private PayloadProcessor initPayloadProcessor () {
436463 String payloadProcessorsDefinitions = getStringParameter (MM_PAYLOAD_PROCESSORS , null );
437464 logger .info ("Parsing PayloadProcessor definition '{}'" , payloadProcessorsDefinitions );
@@ -445,14 +472,16 @@ private PayloadProcessor initPayloadProcessor() {
445472 String modelId = uri .getQuery ();
446473 String method = uri .getFragment ();
447474 if ("http" .equals (processorName )) {
475+ logger .info ("Initializing HTTP payload processor" );
448476 processor = new RemotePayloadProcessor (uri );
449477 } else if ("https" .equals (processorName )) {
450478 SSLContext sslContext ;
451479 try {
452- sslContext = SSLContext . getDefault ();
453- } catch (NoSuchAlgorithmException missingAlgorithmException ) {
480+ sslContext = loadSSLContext ();
481+ } catch (Exception missingAlgorithmException ) {
454482 throw new UncheckedIOException (new IOException (missingAlgorithmException ));
455483 }
484+ logger .info ("Initializing HTTPS payload processor" );
456485 processor = new RemotePayloadProcessor (uri , sslContext , sslContext .getDefaultSSLParameters ());
457486 } else if ("logger" .equals (processorName )) {
458487 processor = new LoggingPayloadProcessor ();
0 commit comments