Author: orudyy
Date: Fri Feb 12 18:27:37 2016
New Revision: 1730088

URL: http://svn.apache.org/viewvc?rev=1730088&view=rev
Log:
QPID-7056: [Java Broker, Java Client] Improve TLS handling

* Respect order of TLS cipher suites
* remove enabled/disabled cipherSuites/protocol context variables in favour of 
white/black list
* Support RegEx in TLS protocol/cipherSuite white/black lists
* unify the creation of SSLContext and try several protocols by default.

Modified:
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Port.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManagerImpl.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionTLSDelegate.java
    
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/util/ConnectionBuilder.java
    
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/transport/TCPandSSLTransportTest.java
    
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
    
qpid/java/trunk/broker-plugins/websocket/src/main/java/org/apache/qpid/server/transport/websocket/WebSocketProvider.java
    
qpid/java/trunk/common/src/main/java/org/apache/qpid/configuration/CommonProperties.java
    
qpid/java/trunk/common/src/main/java/org/apache/qpid/ssl/SSLContextFactory.java
    
qpid/java/trunk/common/src/main/java/org/apache/qpid/transport/network/security/SecurityLayerFactory.java
    
qpid/java/trunk/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java
    
qpid/java/trunk/common/src/test/java/org/apache/qpid/transport/network/security/ssl/SSLUtilTest.java
    
qpid/java/trunk/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Broker.java
 Fri Feb 12 18:27:37 2016
@@ -23,6 +23,7 @@ package org.apache.qpid.server.model;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.qpid.configuration.CommonProperties;
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.logging.EventLoggerProvider;
 import org.apache.qpid.server.model.adapter.BrokerAdapter;
@@ -88,6 +89,18 @@ public interface Broker<X extends Broker
     @ManagedContextDefault(name = BROKER_MSG_AUTH)
     boolean DEFAULT_BROKER_MSG_AUTH = false;
 
+    @ManagedContextDefault(name = 
CommonProperties.QPID_SECURITY_TLS_PROTOCOL_WHITE_LIST)
+    String DEFAULT_SECURITY_TLS_PROTOCOL_WHITE_LIST = "[\"TLSv1\\\\.[0-9]+\"]";
+
+    @ManagedContextDefault(name = 
CommonProperties.QPID_SECURITY_TLS_PROTOCOL_BLACK_LIST)
+    String DEFAULT_SECURITY_TLS_PROTOCOL_BLACK_LIST = "[\"TLSv1\\\\.0\"]";
+
+    @ManagedContextDefault(name = 
CommonProperties.QPID_SECURITY_TLS_CIPHER_SUITE_WHITE_LIST)
+    String DEFAULT_SECURITY_TLS_CIPHER_SUITE_WHITE_LIST = "[]";
+
+    @ManagedContextDefault(name = 
CommonProperties.QPID_SECURITY_TLS_CIPHER_SUITE_BLACK_LIST)
+    String DEFAULT_SECURITY_TLS_CIPHER_SUITE_BLACK_LIST = "[]";
+
     @DerivedAttribute
     String getBuildVersion();
 

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Port.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Port.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Port.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/Port.java
 Fri Feb 12 18:27:37 2016
@@ -21,10 +21,13 @@
 package org.apache.qpid.server.model;
 
 import java.util.Collection;
+import java.util.List;
 import java.util.Set;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
+import org.apache.qpid.configuration.CommonProperties;
+
 @ManagedObject( description = Port.CLASS_DESCRIPTION )
 public interface Port<X extends Port<X>> extends ConfiguredObject<X>
 {
@@ -70,17 +73,11 @@ public interface Port<X extends Port<X>>
     @ManagedAttribute
     Collection<TrustStore> getTrustStores();
 
-    @ManagedContextDefault(name = "qpid.port.enabledCipherSuites" )
-    String DEFAULT_ENABLED_CIPHER_SUITES="[]";
-
-    @ManagedAttribute( defaultValue = "${qpid.port.enabledCipherSuites}")
-    Collection<String> getEnabledCipherSuites();
-
-    @ManagedContextDefault(name = "qpid.port.disabledCipherSuites" )
-    String DEFAULT_DISABLED_CIPHER_SUITES="[]";
+    @ManagedAttribute( defaultValue = "${" + 
CommonProperties.QPID_SECURITY_TLS_CIPHER_SUITE_WHITE_LIST + "}")
+    List<String> getCipherSuiteWhiteList();
 
-    @ManagedAttribute( defaultValue = "${qpid.port.disabledCipherSuites}")
-    Collection<String> getDisabledCipherSuites();
+    @ManagedAttribute( defaultValue = "${" + 
CommonProperties.QPID_SECURITY_TLS_CIPHER_SUITE_BLACK_LIST + "}")
+    List<String> getCipherSuiteBlackList();
 
     Collection<Connection> getConnections();
 

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
 Fri Feb 12 18:27:37 2016
@@ -24,6 +24,7 @@ package org.apache.qpid.server.model.por
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -72,9 +73,9 @@ abstract public class AbstractPort<X ext
     private Set<Protocol> _protocols;
 
     @ManagedAttributeField
-    private Collection<String> _enabledCipherSuites;
+    private List<String> _cipherSuiteWhiteList;
     @ManagedAttributeField
-    private Collection<String> _disabledCipherSuites;
+    private List<String> _cipherSuiteBlackList;
 
     public AbstractPort(Map<String, Object> attributes,
                         Broker<?> broker)
@@ -269,15 +270,15 @@ abstract public class AbstractPort<X ext
     }
 
     @Override
-    public Collection<String> getEnabledCipherSuites()
+    public List<String> getCipherSuiteWhiteList()
     {
-        return _enabledCipherSuites;
+        return _cipherSuiteWhiteList;
     }
 
     @Override
-    public Collection<String> getDisabledCipherSuites()
+    public List<String> getCipherSuiteBlackList()
     {
-        return _disabledCipherSuites;
+        return _cipherSuiteBlackList;
     }
 
     @Override

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/model/port/AmqpPortImpl.java
 Fri Feb 12 18:27:37 2016
@@ -74,6 +74,7 @@ import org.apache.qpid.server.transport.
 import org.apache.qpid.server.util.PortUtil;
 import org.apache.qpid.server.util.ServerScopedRuntimeException;
 import org.apache.qpid.transport.network.security.ssl.QpidMultipleTrustManager;
+import org.apache.qpid.transport.network.security.ssl.SSLUtil;
 
 public class AmqpPortImpl extends 
AbstractClientAuthCapablePortWithAuthProvider<AmqpPortImpl> implements 
AmqpPort<AmqpPortImpl>
 {
@@ -384,7 +385,7 @@ public class AmqpPortImpl extends Abstra
 
         try
         {
-            SSLContext sslContext = SSLContext.getInstance("TLS");
+            SSLContext sslContext = SSLUtil.tryGetSSLContext();
 
             KeyManager[] keyManagers = keyStore.getKeyManagers();
 

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/SiteSpecificTrustStoreImpl.java
 Fri Feb 12 18:27:37 2016
@@ -65,6 +65,7 @@ import org.apache.qpid.server.model.Stat
 import org.apache.qpid.server.model.TrustStore;
 import org.apache.qpid.server.model.VirtualHost;
 import 
org.apache.qpid.server.security.auth.manager.SimpleLDAPAuthenticationManager;
+import org.apache.qpid.transport.network.security.ssl.SSLUtil;
 import org.apache.qpid.transport.util.Functions;
 
 @ManagedObject( category = false )
@@ -218,7 +219,7 @@ public class SiteSpecificTrustStoreImpl
         {
 
             URL url = new URL(getSiteUrl());
-            SSLContext sslContext = SSLContext.getInstance("TLS");
+            SSLContext sslContext = SSLUtil.tryGetSSLContext();
             sslContext.init(new KeyManager[0], new TrustManager[] {new 
AlwaysTrustManager()}, null);
 
             try(SSLSocket socket = (SSLSocket) 
sslContext.getSocketFactory().createSocket(url.getHost(), url.getPort()))

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManagerImpl.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManagerImpl.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManagerImpl.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/security/auth/manager/SimpleLDAPAuthenticationManagerImpl.java
 Fri Feb 12 18:27:37 2016
@@ -41,6 +41,7 @@ import javax.naming.directory.SearchCont
 import javax.naming.directory.SearchResult;
 import javax.net.SocketFactory;
 import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
 import javax.security.auth.callback.Callback;
 import javax.security.auth.callback.CallbackHandler;
 import javax.security.auth.callback.NameCallback;
@@ -66,7 +67,7 @@ import org.apache.qpid.server.security.a
 import org.apache.qpid.server.security.auth.sasl.plain.PlainPasswordCallback;
 import org.apache.qpid.server.security.auth.sasl.plain.PlainSaslServer;
 import org.apache.qpid.server.util.StringUtil;
-import org.apache.qpid.ssl.SSLContextFactory;
+import org.apache.qpid.transport.network.security.ssl.SSLUtil;
 
 public class SimpleLDAPAuthenticationManagerImpl extends 
AbstractAuthenticationManager<SimpleLDAPAuthenticationManagerImpl>
         implements 
SimpleLDAPAuthenticationManager<SimpleLDAPAuthenticationManagerImpl>
@@ -352,7 +353,7 @@ public class SimpleLDAPAuthenticationMan
     }
 
     /**
-     * If a trust store has been specified, create a {@link SSLContextFactory} 
class that is
+     * If a trust store has been specified, create a {@link SSLSocketFactory} 
class that is
      * associated with the {@link SSLContext} generated from that trust store.
      *
      * @return generated socket factory class
@@ -364,7 +365,7 @@ public class SimpleLDAPAuthenticationMan
         SSLContext sslContext = null;
         try
         {
-            sslContext = SSLContext.getInstance("TLS");
+            sslContext = SSLUtil.tryGetSSLContext();
             sslContext.init(null, trustStore.getTrustManagers(), null);
         }
         catch (GeneralSecurityException e)

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionTLSDelegate.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionTLSDelegate.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionTLSDelegate.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/transport/NonBlockingConnectionTLSDelegate.java
 Fri Feb 12 18:27:37 2016
@@ -20,7 +20,9 @@
 package org.apache.qpid.server.transport;
 
 import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.configuration.CommonProperties;
 import org.apache.qpid.server.model.port.AmqpPort;
+import org.apache.qpid.server.util.ParameterizedTypes;
 import org.apache.qpid.server.util.ServerScopedRuntimeException;
 import org.apache.qpid.transport.network.security.ssl.SSLUtil;
 import org.slf4j.Logger;
@@ -313,12 +315,16 @@ public class NonBlockingConnectionTLSDel
         }
     }
 
-    private SSLEngine createSSLEngine(AmqpPort port)
+    private SSLEngine createSSLEngine(AmqpPort<?> port)
     {
         SSLEngine sslEngine = port.getSSLContext().createSSLEngine();
         sslEngine.setUseClientMode(false);
-        SSLUtil.updateProtocolSupport(sslEngine);
-        SSLUtil.updateEnabledCipherSuites(sslEngine, 
port.getEnabledCipherSuites(), port.getDisabledCipherSuites());
+        final List<String> tlsProtocolWhiteList = (List<String>) 
port.getContextValue(List.class, ParameterizedTypes.LIST_OF_STRINGS,
+                                                                               
       CommonProperties.QPID_SECURITY_TLS_PROTOCOL_WHITE_LIST);
+        final List<String> tlsProtocolBlackList = (List<String>) 
port.getContextValue(List.class, ParameterizedTypes.LIST_OF_STRINGS,
+                                                                               
       CommonProperties.QPID_SECURITY_TLS_PROTOCOL_BLACK_LIST);
+        SSLUtil.updateEnabledTlsProtocols(sslEngine, tlsProtocolWhiteList, 
tlsProtocolBlackList);
+        SSLUtil.updateEnabledCipherSuites(sslEngine, 
port.getCipherSuiteWhiteList(), port.getCipherSuiteBlackList());
 
         if(port.getNeedClientAuth())
         {

Modified: 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/util/ConnectionBuilder.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/util/ConnectionBuilder.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/util/ConnectionBuilder.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/main/java/org/apache/qpid/server/util/ConnectionBuilder.java
 Fri Feb 12 18:27:37 2016
@@ -118,7 +118,7 @@ public class ConnectionBuilder
             final SSLContext sslContext;
             try
             {
-                sslContext = SSLContext.getInstance("TLS");
+                sslContext = SSLUtil.tryGetSSLContext();
                 sslContext.init(null, _trustMangers, null);
             }
             catch (GeneralSecurityException e)

Modified: 
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/transport/TCPandSSLTransportTest.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/transport/TCPandSSLTransportTest.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/transport/TCPandSSLTransportTest.java
 (original)
+++ 
qpid/java/trunk/broker-core/src/test/java/org/apache/qpid/server/transport/TCPandSSLTransportTest.java
 Fri Feb 12 18:27:37 2016
@@ -30,6 +30,7 @@ import java.net.SocketAddress;
 import java.security.KeyStore;
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.List;
 
 import javax.net.ssl.KeyManagerFactory;
 import javax.net.ssl.SSLContext;
@@ -38,12 +39,17 @@ import javax.net.ssl.SSLSocket;
 import javax.net.ssl.TrustManagerFactory;
 import javax.xml.bind.DatatypeConverter;
 
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.qpid.configuration.CommonProperties;
+import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.Protocol;
 import org.apache.qpid.server.model.Transport;
 import org.apache.qpid.server.model.port.AmqpPort;
+import org.apache.qpid.server.util.ParameterizedTypes;
 import org.apache.qpid.test.utils.QpidTestCase;
 
 public class TCPandSSLTransportTest extends QpidTestCase
@@ -146,6 +152,12 @@ public class TCPandSSLTransportTest exte
         when(port.getContextValue(Long.class, 
AmqpPort.PORT_AMQP_THREAD_POOL_KEEP_ALIVE_TIMEOUT)).thenReturn(1l);
         when(port.getContextValue(Long.class, 
AmqpPort.PORT_AMQP_OUTBOUND_MESSAGE_BUFFER_SIZE)).thenReturn(AmqpPort.DEFAULT_PORT_AMQP_OUTBOUND_MESSAGE_BUFFER_SIZE);
         when(port.getContextValue(Integer.class, 
AmqpPort.PORT_AMQP_ACCEPT_BACKLOG)).thenReturn(AmqpPort.DEFAULT_PORT_AMQP_ACCEPT_BACKLOG);
+        ObjectMapper mapper = new ObjectMapper();
+        JavaType type = 
mapper.getTypeFactory().constructCollectionType(List.class, String.class);
+        List<String> whiteList = 
mapper.readValue(Broker.DEFAULT_SECURITY_TLS_PROTOCOL_WHITE_LIST, type);
+        List<String> blackList = 
mapper.readValue(Broker.DEFAULT_SECURITY_TLS_PROTOCOL_BLACK_LIST, type);
+        when(port.getContextValue(List.class, 
ParameterizedTypes.LIST_OF_STRINGS, 
CommonProperties.QPID_SECURITY_TLS_PROTOCOL_BLACK_LIST)).thenReturn(blackList);
+        when(port.getContextValue(List.class, 
ParameterizedTypes.LIST_OF_STRINGS, 
CommonProperties.QPID_SECURITY_TLS_PROTOCOL_WHITE_LIST)).thenReturn(whiteList);
 
         TCPandSSLTransport transport = new TCPandSSLTransport(new 
HashSet<>(Arrays.asList(transports)),
                                                               port,

Modified: 
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
 (original)
+++ 
qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/HttpManagement.java
 Fri Feb 12 18:27:37 2016
@@ -45,6 +45,7 @@ import javax.servlet.http.HttpServletReq
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 
+import org.apache.qpid.configuration.CommonProperties;
 import org.apache.qpid.server.management.plugin.filter.ExceptionHandlingFilter;
 import org.eclipse.jetty.io.EndPoint;
 import org.eclipse.jetty.server.Connector;
@@ -90,6 +91,7 @@ import org.apache.qpid.server.model.*;
 import org.apache.qpid.server.model.adapter.AbstractPluginAdapter;
 import org.apache.qpid.server.model.port.HttpPort;
 import org.apache.qpid.server.model.port.PortManager;
+import org.apache.qpid.server.util.ParameterizedTypes;
 import org.apache.qpid.server.util.ServerScopedRuntimeException;
 import org.apache.qpid.transport.network.security.ssl.QpidMultipleTrustManager;
 import org.apache.qpid.transport.network.security.ssl.SSLUtil;
@@ -386,28 +388,25 @@ public class HttpManagement extends Abst
         {
             throw new IllegalConfigurationException("Key store is not 
configured. Cannot start management on HTTPS port without keystore");
         }
+        final List<String> tlsProtocolWhiteList = getContextValue(List.class, 
ParameterizedTypes.LIST_OF_STRINGS, 
CommonProperties.QPID_SECURITY_TLS_PROTOCOL_WHITE_LIST);
+        final List<String> tlsProtocolBlackList = getContextValue(List.class, 
ParameterizedTypes.LIST_OF_STRINGS, 
CommonProperties.QPID_SECURITY_TLS_PROTOCOL_BLACK_LIST);
         SslContextFactory factory = new SslContextFactory()
                                     {
+                                        @Override
                                         public String[] 
selectProtocols(String[] enabledProtocols, String[] supportedProtocols)
                                         {
-                                            List<String> selectedProtocols = 
new ArrayList<>(Arrays.asList(enabledProtocols));
-                                            
SSLUtil.updateEnabledProtocols(selectedProtocols, supportedProtocols);
-
-                                            return 
selectedProtocols.toArray(new String[selectedProtocols.size()]);
+                                            return 
SSLUtil.filterEnabledProtocols(enabledProtocols, supportedProtocols,
+                                                                               
   tlsProtocolWhiteList, tlsProtocolBlackList);
                                         }
 
+                                        @Override
+                                        public String[] 
selectCipherSuites(String[] enabledCipherSuites, String[] supportedCipherSuites)
+                                        {
+                                            return 
SSLUtil.filterEnabledCipherSuites(enabledCipherSuites, supportedCipherSuites,
+                                                                               
      port.getCipherSuiteWhiteList(), port.getCipherSuiteBlackList());
+                                        }
                                     };
 
-        if(port.getDisabledCipherSuites() != null)
-        {
-            
factory.addExcludeCipherSuites(port.getDisabledCipherSuites().toArray(new 
String[port.getDisabledCipherSuites().size()]));
-        }
-
-        if(port.getEnabledCipherSuites() != null && 
!port.getEnabledCipherSuites().isEmpty())
-        {
-            
factory.setIncludeCipherSuites(port.getEnabledCipherSuites().toArray(new 
String[port.getEnabledCipherSuites().size()]));
-        }
-
         boolean needClientCert = port.getNeedClientAuth() || 
port.getWantClientAuth();
 
         if (needClientCert && trustStores.isEmpty())
@@ -418,7 +417,7 @@ public class HttpManagement extends Abst
 
         try
         {
-            SSLContext sslContext = SSLContext.getInstance("TLS");
+            SSLContext sslContext = SSLUtil.tryGetSSLContext();
             KeyManager[] keyManagers = keyStore.getKeyManagers();
 
             TrustManager[] trustManagers;

Modified: 
qpid/java/trunk/broker-plugins/websocket/src/main/java/org/apache/qpid/server/transport/websocket/WebSocketProvider.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/websocket/src/main/java/org/apache/qpid/server/transport/websocket/WebSocketProvider.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/broker-plugins/websocket/src/main/java/org/apache/qpid/server/transport/websocket/WebSocketProvider.java
 (original)
+++ 
qpid/java/trunk/broker-plugins/websocket/src/main/java/org/apache/qpid/server/transport/websocket/WebSocketProvider.java
 Fri Feb 12 18:27:37 2016
@@ -27,7 +27,6 @@ import java.security.Principal;
 import java.security.cert.Certificate;
 import java.security.cert.X509Certificate;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
@@ -54,6 +53,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.bytebuffer.QpidByteBuffer;
+import org.apache.qpid.configuration.CommonProperties;
 import org.apache.qpid.server.transport.MultiVersionProtocolEngine;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.Protocol;
@@ -64,6 +64,7 @@ import org.apache.qpid.server.transport.
 import org.apache.qpid.server.transport.ProtocolEngine;
 import org.apache.qpid.server.transport.ServerNetworkConnection;
 import org.apache.qpid.server.util.Action;
+import org.apache.qpid.server.util.ParameterizedTypes;
 import org.apache.qpid.server.util.ServerScopedRuntimeException;
 import org.apache.qpid.transport.ByteBufferSender;
 import org.apache.qpid.transport.network.security.ssl.SSLUtil;
@@ -119,29 +120,25 @@ class WebSocketProvider implements Accep
         }
         else if (_transport == Transport.WSS)
         {
+            final List<String> tlsProtocolWhiteList = 
_port.getContextValue(List.class, ParameterizedTypes.LIST_OF_STRINGS, 
CommonProperties.QPID_SECURITY_TLS_PROTOCOL_WHITE_LIST);
+            final List<String> tlsProtocolBlackList = 
_port.getContextValue(List.class, ParameterizedTypes.LIST_OF_STRINGS, 
CommonProperties.QPID_SECURITY_TLS_PROTOCOL_BLACK_LIST);
             SslContextFactory factory = new SslContextFactory()
                                         {
+                                            @Override
                                             public String[] 
selectProtocols(String[] enabledProtocols, String[] supportedProtocols)
                                             {
-                                                List<String> selectedProtocols 
= new ArrayList<>(Arrays.asList(enabledProtocols));
-                                                
SSLUtil.updateEnabledProtocols(selectedProtocols, supportedProtocols);
-
-                                                return 
selectedProtocols.toArray(new String[selectedProtocols.size()]);
+                                                return 
SSLUtil.filterEnabledProtocols(enabledProtocols, supportedProtocols, 
tlsProtocolWhiteList, tlsProtocolBlackList);
                                             }
 
+                                            @Override
+                                            public String[] 
selectCipherSuites(String[] enabledCipherSuites, String[] supportedCipherSuites)
+                                            {
+                                                return 
SSLUtil.filterEnabledCipherSuites(enabledCipherSuites, supportedCipherSuites,
+                                                                               
          _port.getCipherSuiteWhiteList(), _port.getCipherSuiteBlackList());
+                                            }
                                         };
             factory.setSslContext(_sslContext);
 
-            if(_port.getDisabledCipherSuites() != null)
-            {
-                
factory.addExcludeCipherSuites(_port.getDisabledCipherSuites().toArray(new 
String[_port.getDisabledCipherSuites().size()]));
-            }
-
-            if(_port.getEnabledCipherSuites() != null && 
!_port.getEnabledCipherSuites().isEmpty())
-            {
-                
factory.setIncludeCipherSuites(_port.getEnabledCipherSuites().toArray(new 
String[_port.getEnabledCipherSuites().size()]));
-            }
-
             factory.setNeedClientAuth(_port.getNeedClientAuth());
             factory.setWantClientAuth(_port.getWantClientAuth());
             connector = new SslSelectChannelConnector(factory);

Modified: 
qpid/java/trunk/common/src/main/java/org/apache/qpid/configuration/CommonProperties.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/common/src/main/java/org/apache/qpid/configuration/CommonProperties.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/common/src/main/java/org/apache/qpid/configuration/CommonProperties.java
 (original)
+++ 
qpid/java/trunk/common/src/main/java/org/apache/qpid/configuration/CommonProperties.java
 Fri Feb 12 18:27:37 2016
@@ -55,12 +55,15 @@ public class CommonProperties
     public static final String HANDSHAKE_TIMEOUT_PROP_NAME = 
"qpid.handshake_timeout";
     public static final int HANDSHAKE_TIMEOUT_DEFAULT = 2;
 
-    public static final String DISABLED_SSL_PROTOCOLS = 
"qpid.disabled_ssl_protocols";
-    public static final String DISABLED_SSL_PROTOCOLS_DEFAULT = "SSLv3,TLSv1";
-
-    public static final String ENABLED_SSL_PROTOCOLS = 
"qpid.enabled_ssl_protocols";
-    public static final String ENABLED_SSL_PROTOCOLS_DEFAULT = 
"TLSv1.1,TLSv1.2";
+    public static final String QPID_SECURITY_TLS_PROTOCOL_WHITE_LIST = 
"qpid.security.tls.protocolWhiteList";
+    public static final String QPID_SECURITY_TLS_PROTOCOL_WHITE_LIST_DEFAULT = 
"TLSv1\\.[0-9]+";
+    public static final String QPID_SECURITY_TLS_PROTOCOL_BLACK_LIST = 
"qpid.security.tls.protocolBlackList";
+    public static final String QPID_SECURITY_TLS_PROTOCOL_BLACK_LIST_DEFAULT = 
"TLSv1\\.0";
 
+    public static final String QPID_SECURITY_TLS_CIPHER_SUITE_WHITE_LIST = 
"qpid.security.tls.cipherSuiteWhiteList";
+    public static final String 
QPID_SECURITY_TLS_CIPHER_SUITE_WHITE_LIST_DEFAULT = "";
+    public static final String QPID_SECURITY_TLS_CIPHER_SUITE_BLACK_LIST = 
"qpid.security.tls.cipherSuiteBlackList";
+    public static final String 
QPID_SECURITY_TLS_CIPHER_SUITE_BLACK_LIST_DEFAULT = "";
 
     /** The name of the version properties file to load from the class path. */
     public static final String VERSION_RESOURCE = "qpidversion.properties";

Modified: 
qpid/java/trunk/common/src/main/java/org/apache/qpid/ssl/SSLContextFactory.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/common/src/main/java/org/apache/qpid/ssl/SSLContextFactory.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/common/src/main/java/org/apache/qpid/ssl/SSLContextFactory.java 
(original)
+++ 
qpid/java/trunk/common/src/main/java/org/apache/qpid/ssl/SSLContextFactory.java 
Fri Feb 12 18:27:37 2016
@@ -42,8 +42,6 @@ import java.security.NoSuchAlgorithmExce
  */
 public class SSLContextFactory
 {
-    public static final String TRANSPORT_LAYER_SECURITY_CODE = "TLS";
-
     private SSLContextFactory()
     {
         //no instances
@@ -53,8 +51,7 @@ public class SSLContextFactory
             throws NoSuchAlgorithmException, KeyManagementException
     {
         // Initialize the SSLContext to work with our key managers.
-        final SSLContext sslContext = SSLContext
-                .getInstance(TRANSPORT_LAYER_SECURITY_CODE);
+        final SSLContext sslContext = SSLUtil.tryGetSSLContext();
 
         sslContext.init(keyManagers, trustManagers, null);
 

Modified: 
qpid/java/trunk/common/src/main/java/org/apache/qpid/transport/network/security/SecurityLayerFactory.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/common/src/main/java/org/apache/qpid/transport/network/security/SecurityLayerFactory.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/common/src/main/java/org/apache/qpid/transport/network/security/SecurityLayerFactory.java
 (original)
+++ 
qpid/java/trunk/common/src/main/java/org/apache/qpid/transport/network/security/SecurityLayerFactory.java
 Fri Feb 12 18:27:37 2016
@@ -20,11 +20,16 @@
  */
 package org.apache.qpid.transport.network.security;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
 import javax.net.ssl.KeyManager;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.TrustManager;
 
+import org.apache.qpid.configuration.CommonProperties;
 import org.apache.qpid.ssl.SSLContextFactory;
 import org.apache.qpid.transport.ByteBufferSender;
 import org.apache.qpid.transport.ConnectionSettings;
@@ -97,11 +102,24 @@ public class SecurityLayerFactory
                 _hostname = settings.getHost();
             }
 
+            List<String> protocolWhiteList =
+                    
getSystemPropertyAsList(CommonProperties.QPID_SECURITY_TLS_PROTOCOL_WHITE_LIST,
+                                            
CommonProperties.QPID_SECURITY_TLS_PROTOCOL_WHITE_LIST_DEFAULT);
+            List<String> protocolBlackList =
+                    
getSystemPropertyAsList(CommonProperties.QPID_SECURITY_TLS_PROTOCOL_BLACK_LIST,
+                                            
CommonProperties.QPID_SECURITY_TLS_PROTOCOL_BLACK_LIST_DEFAULT);
+            List<String> cipherSuiteWhiteList =
+                    
getSystemPropertyAsList(CommonProperties.QPID_SECURITY_TLS_CIPHER_SUITE_WHITE_LIST,
+                                            
CommonProperties.QPID_SECURITY_TLS_CIPHER_SUITE_WHITE_LIST_DEFAULT);
+            List<String> cipherSuiteBlackList =
+                    
getSystemPropertyAsList(CommonProperties.QPID_SECURITY_TLS_CIPHER_SUITE_BLACK_LIST,
+                                            
CommonProperties.QPID_SECURITY_TLS_CIPHER_SUITE_BLACK_LIST_DEFAULT);
             try
             {
                 _engine = sslCtx.createSSLEngine();
                 _engine.setUseClientMode(true);
-                SSLUtil.updateProtocolSupport(_engine);
+                SSLUtil.updateEnabledTlsProtocols(_engine, protocolWhiteList, 
protocolBlackList);
+                SSLUtil.updateEnabledCipherSuites(_engine, 
cipherSuiteWhiteList, cipherSuiteBlackList);
             }
             catch(Exception e)
             {
@@ -110,6 +128,17 @@ public class SecurityLayerFactory
 
         }
 
+        private List<String> getSystemPropertyAsList(final String 
propertyName, final String defaultValue)
+        {
+            String listAsString = System.getProperty(propertyName, 
defaultValue);
+            List<String> listOfStrings = Collections.emptyList();
+            if(listAsString != null && !"".equals(listAsString))
+            {
+                listOfStrings = Arrays.asList(listAsString.split("\\s*,\\s*"));
+            }
+            return listOfStrings;
+        }
+
         public ByteBufferSender sender(ByteBufferSender delegate)
         {
             SSLSender sender = new SSLSender(_engine, _layer.sender(delegate), 
_sslStatus);

Modified: 
qpid/java/trunk/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java
 (original)
+++ 
qpid/java/trunk/common/src/main/java/org/apache/qpid/transport/network/security/ssl/SSLUtil.java
 Fri Feb 12 18:27:37 2016
@@ -27,9 +27,6 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.StringReader;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
 import java.math.BigInteger;
 import java.net.URL;
 import java.nio.BufferUnderflowException;
@@ -51,26 +48,23 @@ import java.security.spec.PKCS8EncodedKe
 import java.security.spec.RSAPrivateCrtKeySpec;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
-import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
 import javax.naming.InvalidNameException;
 import javax.naming.ldap.LdapName;
 import javax.naming.ldap.Rdn;
+import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLPeerUnverifiedException;
-import javax.net.ssl.SSLServerSocket;
 import javax.net.ssl.SSLSocket;
 import javax.xml.bind.DatatypeConverter;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.qpid.configuration.CommonProperties;
 import org.apache.qpid.transport.TransportException;
 
 public class SSLUtil
@@ -78,6 +72,7 @@ public class SSLUtil
     private static final Logger LOGGER = 
LoggerFactory.getLogger(SSLUtil.class);
 
     private static final Integer DNS_NAME_TYPE = 2;
+    public static final String[] TLS_PROTOCOL_PREFERENCES = new 
String[]{"TLSv1.2", "TLSv1.1", "TLS", "TLSv1"};
 
     private SSLUtil()
     {
@@ -478,111 +473,134 @@ public class SSLUtil
         return new BigInteger(num);
     }
 
-    public static String[] getExcludedSSlProtocols()
-    {
-        String property = 
System.getProperty(CommonProperties.DISABLED_SSL_PROTOCOLS,
-                                             
CommonProperties.DISABLED_SSL_PROTOCOLS_DEFAULT);
-        return property.split("\\s*,\\s*");
+    public static void updateEnabledTlsProtocols(final SSLEngine engine,
+                                                 final List<String> 
protocolWhiteList,
+                                                 final List<String> 
protocolBlackList)
+    {
+        String[] filteredProtocols = 
filterEnabledProtocols(engine.getEnabledProtocols(),
+                                                            
engine.getSupportedProtocols(),
+                                                            protocolWhiteList,
+                                                            protocolBlackList);
+        engine.setEnabledProtocols(filteredProtocols);
     }
 
-
-    public static String[] getEnabledSSlProtocols()
+    public static void updateEnabledTlsProtocols(final SSLSocket socket,
+                                             final List<String> 
protocolWhiteList,
+                                             final List<String> 
protocolBlackList)
     {
-        String property = 
System.getProperty(CommonProperties.ENABLED_SSL_PROTOCOLS,
-                                             
CommonProperties.ENABLED_SSL_PROTOCOLS_DEFAULT);
-        return property.split("\\s*,\\s*");
+        String[] filteredProtocols = 
filterEnabledProtocols(socket.getEnabledProtocols(),
+                                                            
socket.getSupportedProtocols(),
+                                                            protocolWhiteList,
+                                                            protocolBlackList);
+        socket.setEnabledProtocols(filteredProtocols);
     }
 
-    public static void updateProtocolSupport(final SSLEngine engine)
+    public static String[] filterEnabledProtocols(final String[] 
enabledProtocols,
+                                                  final String[] 
supportedProtocols,
+                                                  final List<String> 
protocolWhiteList,
+                                                  final List<String> 
protocolBlackList)
     {
-        List<String> enabledProtocols = new 
ArrayList<>(Arrays.asList(engine.getEnabledProtocols()));
-        String[] supportedProtocols = engine.getSupportedProtocols();
-        boolean modified = updateEnabledProtocols(enabledProtocols, 
supportedProtocols);
-        if(modified)
-        {
-            engine.setEnabledProtocols(enabledProtocols.toArray(new 
String[enabledProtocols.size()]));
-        }
+        return filterEntries(enabledProtocols, supportedProtocols, 
protocolWhiteList, protocolBlackList);
     }
 
-    public static boolean updateEnabledProtocols(final List<String> 
enabledProtocols, final String[] supportedProtocols)
+    public static String[] filterEnabledCipherSuites(final String[] 
enabledCipherSuites,
+                                                     final String[] 
supportedCipherSuites,
+                                                     final List<String> 
cipherSuiteWhiteList,
+                                                     final List<String> 
cipherSuiteBlackList)
     {
-        boolean modified = false;
-        for(String protocol : getExcludedSSlProtocols())
-        {
-            if (enabledProtocols.contains(protocol))
-            {
-                enabledProtocols.remove(protocol);
-                modified = true;
-            }
-        }
-        for(String protocol : getEnabledSSlProtocols())
-        {
-            if(!enabledProtocols.contains(protocol) && 
Arrays.asList(supportedProtocols).contains(protocol))
-            {
-                enabledProtocols.add(protocol);
-                modified = true;
-            }
-        }
-        return modified;
+        return filterEntries(enabledCipherSuites, supportedCipherSuites, 
cipherSuiteWhiteList, cipherSuiteBlackList);
     }
 
 
     public static void updateEnabledCipherSuites(final SSLEngine engine,
-                                                 final Collection<String> 
enabledCipherSuites,
-                                                 final Collection<String> 
disabledCipherSuites)
+                                                 final List<String> 
cipherSuitesWhiteList,
+                                                 final List<String> 
cipherSuitesBlackList)
     {
-        if(enabledCipherSuites != null && !enabledCipherSuites.isEmpty())
-        {
-            final Set<String> supportedSuites =
-                    new 
HashSet<>(Arrays.asList(engine.getSupportedCipherSuites()));
-            supportedSuites.retainAll(enabledCipherSuites);
-            engine.setEnabledCipherSuites(supportedSuites.toArray(new 
String[supportedSuites.size()]));
-        }
-
-        if(disabledCipherSuites != null && !disabledCipherSuites.isEmpty())
-        {
-            final Set<String> enabledSuites = new 
HashSet<>(Arrays.asList(engine.getEnabledCipherSuites()));
-            enabledSuites.removeAll(disabledCipherSuites);
-            engine.setEnabledCipherSuites(enabledSuites.toArray(new 
String[enabledSuites.size()]));
-        }
-
+        String[] filteredCipherSuites = 
filterEntries(engine.getEnabledCipherSuites(),
+                                                      
engine.getSupportedCipherSuites(),
+                                                      cipherSuitesWhiteList,
+                                                      cipherSuitesBlackList);
+        engine.setEnabledCipherSuites(filteredCipherSuites);
     }
 
     public static void updateEnabledCipherSuites(final SSLSocket socket,
-                                                 final List<String> 
enabledCipherSuites,
-                                                 final List<String> 
disabledCipherSuites)
+                                                 final List<String> 
cipherSuitesWhiteList,
+                                                 final List<String> 
cipherSuitesBlackList)
     {
-        if (enabledCipherSuites != null && !enabledCipherSuites.isEmpty())
+        String[] filteredCipherSuites = 
filterEntries(socket.getEnabledCipherSuites(),
+                                                      
socket.getSupportedCipherSuites(),
+                                                      cipherSuitesWhiteList,
+                                                      cipherSuitesBlackList);
+        socket.setEnabledCipherSuites(filteredCipherSuites);
+    }
+
+    static String[] filterEntries(final String[] enabledEntries,
+                                  final String[] supportedEntries,
+                                  final List<String> whiteList,
+                                  final List<String> blackList)
+    {
+        List<String> filteredList;
+        if (whiteList != null && !whiteList.isEmpty())
+        {
+            filteredList = new ArrayList<>();
+            List<String> supportedList = new 
ArrayList<>(Arrays.asList(supportedEntries));
+            // the outer loop must be over the white list to preserve its order
+            for (String whiteListedRegEx : whiteList)
+            {
+                Iterator<String> supportedIter = supportedList.iterator();
+                while (supportedIter.hasNext())
+                {
+                    String supportedEntry = supportedIter.next();
+                    if (supportedEntry.matches(whiteListedRegEx))
+                    {
+                        filteredList.add(supportedEntry);
+                        supportedIter.remove();
+                    }
+                }
+            }
+        }
+        else
         {
-            List<String> supportedSuites = 
Arrays.asList(socket.getSupportedCipherSuites());
-            supportedSuites.retainAll(enabledCipherSuites);
-            socket.setEnabledCipherSuites(supportedSuites.toArray(new 
String[supportedSuites.size()]));
+            filteredList = new ArrayList<>(Arrays.asList(enabledEntries));
         }
 
-        if (disabledCipherSuites != null && !disabledCipherSuites.isEmpty())
+        if (blackList != null && !blackList.isEmpty())
         {
-            List<String> enabledSuites = 
Arrays.asList(socket.getEnabledCipherSuites());
-            enabledSuites.removeAll(disabledCipherSuites);
-            socket.setEnabledCipherSuites(enabledSuites.toArray(new 
String[enabledSuites.size()]));
+            for (String blackListedRegEx : blackList)
+            {
+                Iterator<String> entriesIter = filteredList.iterator();
+                while (entriesIter.hasNext())
+                {
+                    if (entriesIter.next().matches(blackListedRegEx))
+                    {
+                        entriesIter.remove();
+                    }
+                }
+            }
         }
+
+        return filteredList.toArray(new String[filteredList.size()]);
     }
 
-    public static void updateEnabledTlsProtocols(final SSLSocket socket,
-                                                 final List<String> 
enabledTlsProtocols,
-                                                 final List<String> 
disabledTlsProtocols)
+    public static SSLContext tryGetSSLContext()
     {
-        if (enabledTlsProtocols != null && !enabledTlsProtocols.isEmpty())
-        {
-            List<String> supportedProtocols = 
Arrays.asList(socket.getSupportedProtocols());
-            supportedProtocols.retainAll(enabledTlsProtocols);
-            socket.setEnabledProtocols(supportedProtocols.toArray(new 
String[supportedProtocols.size()]));
-        }
+        return tryGetSSLContext(TLS_PROTOCOL_PREFERENCES);
+    }
 
-        if (disabledTlsProtocols != null && !disabledTlsProtocols.isEmpty())
+    public static SSLContext tryGetSSLContext(final String[] protocols)
+    {
+        for (String protocol : protocols)
         {
-            List<String> enabledProtocols = 
Arrays.asList(socket.getEnabledProtocols());
-            enabledProtocols.removeAll(disabledTlsProtocols);
-            socket.setEnabledProtocols(enabledProtocols.toArray(new 
String[enabledProtocols.size()]));
+            try
+            {
+                return SSLContext.getInstance(protocol);
+            }
+            catch (NoSuchAlgorithmException e)
+            {
+                // pass and try the next protocol in the list
+            }
         }
+        throw new RuntimeException(String.format("Could not create SSLContext 
with one of the requested protocols: %s",
+                                                 Arrays.toString(protocols)));
     }
 }

Modified: 
qpid/java/trunk/common/src/test/java/org/apache/qpid/transport/network/security/ssl/SSLUtilTest.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/common/src/test/java/org/apache/qpid/transport/network/security/ssl/SSLUtilTest.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/common/src/test/java/org/apache/qpid/transport/network/security/ssl/SSLUtilTest.java
 (original)
+++ 
qpid/java/trunk/common/src/test/java/org/apache/qpid/transport/network/security/ssl/SSLUtilTest.java
 Fri Feb 12 18:27:37 2016
@@ -39,6 +39,40 @@ import org.apache.qpid.transport.Transpo
 
 public class SSLUtilTest extends QpidTestCase
 {
+    public void testFilterEntries_empty()
+    {
+        String[] enabled = {};
+        String[] supported = {};
+        List<String> whiteList = Arrays.asList();
+        List<String> blackList = Arrays.asList();
+        String[] result = SSLUtil.filterEntries(enabled, supported, whiteList, 
blackList);
+        assertEquals("filtered list is not empty", 0, result.length);
+    }
+
+    public void testFilterEntries_whiteListNotEmpty_blackListEmpty()
+    {
+        List<String> whiteList = Arrays.asList("TLSv1\\.[0-9]+");
+        List<String> blackList = Collections.emptyList();
+        String[] enabled = {"TLS", "TLSv1.1", "TLSv1.2"};
+        String[] expected = {"TLSv1.1", "TLSv1.2"};
+        String[] supported = {"SSLv3", "TLS", "TLSv1", "TLSv1.1", "TLSv1.2"};
+        String[] result = SSLUtil.filterEntries(enabled, supported, whiteList, 
blackList);
+        assertTrue("unexpected filtered list: expected " + 
Arrays.toString(expected) + " actual " + Arrays.toString(
+                result), Arrays.equals(expected, result));
+    }
+
+    public void testFilterEntries_whiteListEmpty_blackListNotEmpty()
+    {
+        List<String> whiteList = Arrays.asList();
+        List<String> blackList = Arrays.asList("TLSv1\\.[0-9]+");
+        String[] enabled = {"TLS", "TLSv1.1", "TLSv1.2"};
+        String[] expected = {"TLS"};
+        String[] supported = {"SSLv3", "TLS", "TLSv1", "TLSv1.1", "TLSv1.2"};
+        String[] result = SSLUtil.filterEntries(enabled, supported, whiteList, 
blackList);
+        assertTrue("unexpected filtered list: expected " + 
Arrays.toString(expected) + " actual " + Arrays.toString(
+                result), Arrays.equals(expected, result));
+    }
+
     public void testGetIdFromSubjectDN()
     {
         // "normal" dn

Modified: 
qpid/java/trunk/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java
URL: 
http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java?rev=1730088&r1=1730087&r2=1730088&view=diff
==============================================================================
--- 
qpid/java/trunk/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java
 (original)
+++ 
qpid/java/trunk/systests/src/main/java/org/apache/qpid/systest/rest/RestTestHelper.java
 Fri Feb 12 18:27:37 2016
@@ -177,7 +177,7 @@ public class RestTestHelper
                                                          
KeyManagerFactory.getDefaultAlgorithm(),
                                                          _clientAuthAlias);
 
-                final SSLContext sslContext = 
SSLContext.getInstance(SSLUtil.getEnabledSSlProtocols()[SSLUtil.getEnabledSSlProtocols().length-1]);
+                final SSLContext sslContext = SSLUtil.tryGetSSLContext();
 
                 sslContext.init(keyManagers, trustManagers, null);
 
@@ -209,8 +209,7 @@ public class RestTestHelper
                 keyManagers =
                         SSLContextFactory.getKeyManagers(null, null, null, 
null, null);
 
-
-                final SSLContext sslContext = 
SSLContext.getInstance(SSLUtil.getEnabledSSlProtocols()[SSLUtil.getEnabledSSlProtocols().length-1]);
+                final SSLContext sslContext = SSLUtil.tryGetSSLContext();
 
                 sslContext.init(keyManagers, trustManagers, null);
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to