You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by kk...@apache.org on 2014/11/13 18:39:41 UTC

svn commit: r1639415 - in /tomcat/tc6.0.x/trunk: ./ java/org/apache/coyote/http11/ java/org/apache/tomcat/util/net/ java/org/apache/tomcat/util/net/jsse/ java/org/apache/tomcat/util/net/jsse/res/ webapps/docs/ webapps/docs/config/

Author: kkolinko
Date: Thu Nov 13 17:39:41 2014
New Revision: 1639415

URL: http://svn.apache.org/r1639415
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56780
Enable Tomcat to start when using a IBM JRE in strict SP800-131a mode
This back-ports the fix as well as some additional changes to more closely
align the Tomcat 6 code with the code in Tomcat 7.

Modified:
    tomcat/tc6.0.x/trunk/STATUS.txt
    tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java
    tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SSLImplementation.java
    tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEFactory.java
    tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java
    tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java
    tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/res/LocalStrings.properties
    tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
    tomcat/tc6.0.x/trunk/webapps/docs/config/http.xml

Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=1639415&r1=1639414&r2=1639415&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Thu Nov 13 17:39:41 2014
@@ -28,13 +28,7 @@ None
 PATCHES PROPOSED TO BACKPORT:
   [ New proposals should be added at the end of the list ]
 
-* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56780
-  Enable Tomcat to start when using a IBM JRE in strict SP800-131a mode
-  This back-ports the fix as well as some additional changes to more closely
-  align the Tomcat 6 code with the code in Tomcat 7.
-  https://people.apache.org/~kkolinko/patches/2014-11-09_tc6_bug56780-v3.patch
-  +1: kkolinko, markt, remm
-  -1:
+None
 
 
 PATCHES/ISSUES THAT ARE STALLED:

Modified: tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java?rev=1639415&r1=1639414&r2=1639415&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/coyote/http11/Http11Protocol.java Thu Nov 13 17:39:41 2014
@@ -85,6 +85,7 @@ public class Http11Protocol extends Abst
     protected Http11ConnectionHandler cHandler = new Http11ConnectionHandler(this);
     protected JIoEndpoint endpoint = new JIoEndpoint();
 
+    @Override
     protected final AbstractEndpoint getEndpoint() {
         return endpoint;
     }
@@ -155,7 +156,8 @@ public class Http11Protocol extends Abst
             if (isSSLEnabled()) {
                 sslImplementation =
                     SSLImplementation.getInstance(sslImplementationName);
-                socketFactory = sslImplementation.getServerSocketFactory();
+                socketFactory = sslImplementation.getServerSocketFactory(
+                        (String) getAttribute("sslProtocol"));
                 endpoint.setServerSocketFactory(socketFactory);
             } else if (socketFactoryName != null) {
                 socketFactory = (ServerSocketFactory) Class.forName(socketFactoryName).newInstance();
@@ -556,6 +558,7 @@ public class Http11Protocol extends Abst
         protected ConcurrentLinkedQueue<Http11Processor> recycledProcessors =
             new ConcurrentLinkedQueue<Http11Processor>() {
             protected AtomicInteger size = new AtomicInteger(0);
+            @Override
             public boolean offer(Http11Processor processor) {
                 boolean offer = (proto.processorCache == -1) ? true : (size.get() < proto.processorCache);
                 //avoid over growing our cache or add after we have stopped
@@ -570,6 +573,7 @@ public class Http11Protocol extends Abst
                 return result;
             }
 
+            @Override
             public Http11Processor poll() {
                 Http11Processor result = super.poll();
                 if ( result != null ) {
@@ -578,6 +582,7 @@ public class Http11Protocol extends Abst
                 return result;
             }
 
+            @Override
             public void clear() {
                 Http11Processor next = poll();
                 while ( next != null ) {

Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SSLImplementation.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SSLImplementation.java?rev=1639415&r1=1639414&r2=1639415&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SSLImplementation.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/SSLImplementation.java Thu Nov 13 17:39:41 2014
@@ -68,7 +68,7 @@ abstract public class SSLImplementation 
 	    if( JSSEImplementationClass.equals(className) ) {
 		return new org.apache.tomcat.util.net.jsse.JSSEImplementation();
 	    }
-	    Class clazz=Class.forName(className);
+	    Class<?> clazz=Class.forName(className);
 	    return (SSLImplementation)clazz.newInstance();
 	} catch (Exception e){
 	    if(logger.isDebugEnabled())
@@ -81,6 +81,7 @@ abstract public class SSLImplementation 
 
     abstract public String getImplementationName();
     abstract public ServerSocketFactory getServerSocketFactory();
+    abstract public ServerSocketFactory getServerSocketFactory(String sslProtocol);
     abstract public SSLSupport getSSLSupport(Socket sock);
     
     /**

Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEFactory.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEFactory.java?rev=1639415&r1=1639414&r2=1639415&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEFactory.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEFactory.java Thu Nov 13 17:39:41 2014
@@ -19,20 +19,19 @@ package org.apache.tomcat.util.net.jsse;
 
 import java.net.Socket;
 
+import javax.net.ssl.SSLSession;
 import javax.net.ssl.SSLSocket;
 
 import org.apache.tomcat.util.net.SSLSupport;
 import org.apache.tomcat.util.net.ServerSocketFactory;
-import javax.net.ssl.SSLSession;
 
-/** 
+/**
  * Factory interface to construct components based on the JSSE version
  * in use.
  *
  * @author Bill Barker
  * @author Filip Hanik
  */
-
 public class JSSEFactory {
 
     /**
@@ -43,14 +42,24 @@ public class JSSEFactory {
     }
 
     /**
+     * Returns the ServerSocketFactory to use.
+     * @param sslProtocol Name of SSL protocol, e.g. "TLS". It is used to
+     *  obtain an instance of <code>javax.net.ssl.SSLContext</code>. If it is
+     *  <code>null</code> then a default will be used.
+     */
+    public ServerSocketFactory getSocketFactory(String sslProtocol) {
+        return new JSSESocketFactory(sslProtocol);
+    }
+
+    /**
      * returns the SSLSupport attached to this socket.
      */
     public SSLSupport getSSLSupport(Socket socket) {
         return new JSSESupport((SSLSocket)socket);
     }
-    
+
     public SSLSupport getSSLSupport(SSLSession session) {
         return new JSSESupport(session);
     }
 
-};
+}

Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java?rev=1639415&r1=1639414&r2=1639415&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSEImplementation.java Thu Nov 13 17:39:41 2014
@@ -47,20 +47,30 @@ public class JSSEImplementation extends 
     }
 
 
+    @Override
     public String getImplementationName(){
       return "JSSE";
     }
-      
+
+    @Override
     public ServerSocketFactory getServerSocketFactory()  {
         ServerSocketFactory ssf = factory.getSocketFactory();
         return ssf;
-    } 
+    }
+
+    @Override
+    public ServerSocketFactory getServerSocketFactory(String sslProtocol)  {
+        ServerSocketFactory ssf = factory.getSocketFactory(sslProtocol);
+        return ssf;
+    }
 
+    @Override
     public SSLSupport getSSLSupport(Socket s) {
         SSLSupport ssls = factory.getSSLSupport(s);
         return ssls;
     }
 
+    @Override
     public SSLSupport getSSLSupport(SSLSession session) {
         SSLSupport ssls = factory.getSSLSupport(session);
         return ssls;

Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java?rev=1639415&r1=1639414&r2=1639415&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java Thu Nov 13 17:39:41 2014
@@ -41,11 +41,11 @@ import java.security.cert.CollectionCert
 import java.security.cert.PKIXBuilderParameters;
 import java.security.cert.X509CertSelector;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.Vector;
 
 import javax.net.ssl.CertPathTrustManagerParameters;
 import javax.net.ssl.KeyManager;
@@ -79,65 +79,26 @@ import org.apache.tomcat.util.res.String
 public class JSSESocketFactory
     extends org.apache.tomcat.util.net.ServerSocketFactory {
 
+    private static final org.apache.juli.logging.Log log =
+            org.apache.juli.logging.LogFactory.getLog(JSSESocketFactory.class);
     private static StringManager sm =
         StringManager.getManager("org.apache.tomcat.util.net.jsse.res");
 
-    private static final boolean RFC_5746_SUPPORTED;
-
-    public static final String[] DEFAULT_SERVER_PROTOCOLS;
-
     // defaults
-    static String defaultProtocol = "TLS";
-    static boolean defaultClientAuth = false;
-    static String defaultKeystoreType = "JKS";
+    private static final String defaultProtocol = "TLS";
+    private static final String defaultKeystoreType = "JKS";
     private static final String defaultKeystoreFile
         = System.getProperty("user.home") + "/.keystore";
-    private static final String defaultKeyPass = "changeit";
     private static final int defaultSessionCacheSize = 0;
     private static final int defaultSessionTimeout = 86400;
+    private static final String ALLOW_ALL_SUPPORTED_CIPHERS = "ALL";
+    private static final String defaultKeyPass = "changeit";
 
-    static org.apache.juli.logging.Log log =
-        org.apache.juli.logging.LogFactory.getLog(JSSESocketFactory.class);
-
-    static {
-        boolean result = false;
-        SSLContext context;
-        String[] protocols = null;
-        try {
-            context = SSLContext.getInstance("TLS");
-            context.init(null, null, new SecureRandom());
-            SSLServerSocketFactory ssf = context.getServerSocketFactory();
-            String ciphers[] = ssf.getSupportedCipherSuites();
-            for (String cipher : ciphers) {
-                if ("TLS_EMPTY_RENEGOTIATION_INFO_SCSV".equals(cipher)) {
-                    result = true;
-                    break;
-                }
-            }
-
-            // There is no API to obtain the default server protocols and cipher
-            // suites. Having inspected the OpenJDK code there the same results
-            // can be achieved via the standard API but there is no guarantee
-            // that every JVM implementation determines the defaults the same
-            // way. Therefore the defaults are determined by creating a server
-            // socket and requested the configured values.
-
-            SSLServerSocket socket = (SSLServerSocket) ssf.createServerSocket();
-            // Filter out all the insecure protocols
-            protocols = filterInsecureProcotols(socket.getEnabledProtocols());
-        } catch (NoSuchAlgorithmException e) {
-            // Assume no RFC 5746 support
-        } catch (KeyManagementException e) {
-            // Assume no RFC 5746 support
-        } catch (IOException e) {
-            // Unable to determine default ciphers/protocols so use none
-        }
-        RFC_5746_SUPPORTED = result;
-        DEFAULT_SERVER_PROTOCOLS = protocols;
-    }
+    private final boolean rfc5746Supported;
+    private final String[] defaultServerProtocols;
+    private final String[] defaultServerCipherSuites;
 
     protected boolean initialized;
-    protected String clientAuth = "false";
     protected SSLServerSocketFactory sslProxy = null;
     protected String[] enabledCiphers;
     protected boolean allowUnsafeLegacyRenegotiation = false;
@@ -154,8 +115,80 @@ public class JSSESocketFactory
 
 
     public JSSESocketFactory () {
+        this(null);
+    }
+
+    public JSSESocketFactory(String sslProtocol) {
+
+        if (sslProtocol == null) {
+            sslProtocol = defaultProtocol;
+        }
+
+        SSLContext context;
+        try {
+             context = SSLContext.getInstance(sslProtocol);
+             context.init(null,  null,  null);
+        } catch (NoSuchAlgorithmException e) {
+            // This is fatal for the connector so throw an exception to prevent
+            // it from starting
+            throw new IllegalArgumentException(e);
+        } catch (KeyManagementException e) {
+            // This is fatal for the connector so throw an exception to prevent
+            // it from starting
+            throw new IllegalArgumentException(e);
+        }
+
+        // Supported cipher suites aren't accessible directly from the
+        // SSLContext so use the SSL server socket factory
+        SSLServerSocketFactory ssf = context.getServerSocketFactory();
+        String supportedCiphers[] = ssf.getSupportedCipherSuites();
+        boolean found = false;
+        for (String cipher : supportedCiphers) {
+            if ("TLS_EMPTY_RENEGOTIATION_INFO_SCSV".equals(cipher)) {
+                found = true;
+                break;
+            }
+        }
+        rfc5746Supported = found;
+
+        // There is no standard way to determine the default protocols and
+        // cipher suites so create a server socket to see what the defaults are
+        SSLServerSocket socket;
+        try {
+            socket = (SSLServerSocket) ssf.createServerSocket();
+        } catch (IOException e) {
+            // This is very likely to be fatal but there is a slim chance that
+            // the JSSE implementation just doesn't like creating unbound
+            // sockets so allow the code to proceed.
+            defaultServerCipherSuites = new String[0];
+            defaultServerProtocols = new String[0];
+            log.warn(sm.getString("jsse.noDefaultCiphers"));
+            log.warn(sm.getString("jsse.noDefaultProtocols"));
+            return;
+        }
+
+        defaultServerCipherSuites = socket.getEnabledCipherSuites();
+        if (defaultServerCipherSuites.length == 0) {
+            log.warn(sm.getString("jsse.noDefaultCiphers"));
+        }
+
+        // Filter out all the SSL protocols (SSLv2 and SSLv3) from the defaults
+        // since they are no longer considered secure
+        List<String> filteredProtocols = new ArrayList<String>();
+        for (String protocol : socket.getEnabledProtocols()) {
+            if (protocol.contains("SSL")) {
+                log.debug(sm.getString("jsse.excludeDefaultProtocol", protocol));
+                continue;
+            }
+            filteredProtocols.add(protocol);
+        }
+        defaultServerProtocols = filteredProtocols.toArray(new String[filteredProtocols.size()]);
+        if (defaultServerProtocols.length == 0) {
+            log.warn(sm.getString("jsse.noDefaultProtocols"));
+        }
     }
 
+    @Override
     public ServerSocket createSocket (int port)
         throws IOException
     {
@@ -165,6 +198,7 @@ public class JSSESocketFactory
         return socket;
     }
 
+    @Override
     public ServerSocket createSocket (int port, int backlog)
         throws IOException
     {
@@ -174,6 +208,7 @@ public class JSSESocketFactory
         return socket;
     }
 
+    @Override
     public ServerSocket createSocket (int port, int backlog,
                                       InetAddress ifAddress)
         throws IOException
@@ -185,6 +220,7 @@ public class JSSESocketFactory
         return socket;
     }
 
+    @Override
     public Socket acceptSocket(ServerSocket socket)
         throws IOException
     {
@@ -198,10 +234,11 @@ public class JSSESocketFactory
         return asock;
     }
 
+    @Override
     public void handshake(Socket sock) throws IOException {
         ((SSLSocket)sock).startHandshake();
 
-        if (!allowUnsafeLegacyRenegotiation && !RFC_5746_SUPPORTED) {
+        if (!allowUnsafeLegacyRenegotiation && !rfc5746Supported) {
             // Prevent further handshakes by removing all cipher suites
             ((SSLSocket) sock).setEnabledCipherSuites(new String[0]);
         }
@@ -216,70 +253,41 @@ public class JSSESocketFactory
      * @return Array of SSL cipher suites to be enabled, or null if none of the
      * requested ciphers are supported
      */
-    protected String[] getEnabledCiphers(String requestedCiphers,
+    protected String[] getEnabledCiphers(String requestedCiphersStr,
                                          String[] supportedCiphers) {
 
-        String[] enabledCiphers = null;
+        if ((requestedCiphersStr == null)
+                || (requestedCiphersStr.trim().length() == 0)) {
+            return defaultServerCipherSuites;
+        }
 
-        if (requestedCiphers != null) {
-            Vector vec = null;
-            String cipher = requestedCiphers;
-            int index = requestedCiphers.indexOf(',');
-            if (index != -1) {
-                int fromIndex = 0;
-                while (index != -1) {
-                    cipher = requestedCiphers.substring(fromIndex, index).trim();
-                    if (cipher.length() > 0) {
-                        /*
-                         * Check to see if the requested cipher is among the
-                         * supported ciphers, i.e., may be enabled
-                         */
-                        for (int i=0; supportedCiphers != null
-                                     && i<supportedCiphers.length; i++) {
-                            if (supportedCiphers[i].equals(cipher)) {
-                                if (vec == null) {
-                                    vec = new Vector();
-                                }
-                                vec.addElement(cipher);
-                                break;
-                            }
-                        }
-                    }
-                    fromIndex = index+1;
-                    index = requestedCiphers.indexOf(',', fromIndex);
-                } // while
-                cipher = requestedCiphers.substring(fromIndex);
-            }
-
-            if (cipher != null) {
-                cipher = cipher.trim();
-                if (cipher.length() > 0) {
-                    /*
-                     * Check to see if the requested cipher is among the
-                     * supported ciphers, i.e., may be enabled
-                     */
-                    for (int i=0; supportedCiphers != null
-                                 && i<supportedCiphers.length; i++) {
-                        if (supportedCiphers[i].equals(cipher)) {
-                            if (vec == null) {
-                                vec = new Vector();
-                            }
-                            vec.addElement(cipher);
-                            break;
-                        }
-                    }
-                }
+        List<String> requestedCiphers = new ArrayList<String>();
+        for (String rc : requestedCiphersStr.split(",")) {
+            final String cipher = rc.trim();
+            if (cipher.length() > 0) {
+                requestedCiphers.add(cipher);
             }
+        }
+        if (requestedCiphers.isEmpty()) {
+            return defaultServerCipherSuites;
+        }
+        List<String> ciphers = new ArrayList<String>(requestedCiphers);
+        ciphers.retainAll(Arrays.asList(supportedCiphers));
 
-            if (vec != null) {
-                enabledCiphers = new String[vec.size()];
-                vec.copyInto(enabledCiphers);
+        if (ciphers.isEmpty()) {
+            log.warn(sm.getString("jsse.requested_ciphers_not_supported",
+                    requestedCiphersStr));
+        }
+        if (log.isDebugEnabled()) {
+            log.debug(sm.getString("jsse.enableable_ciphers", ciphers));
+            if (ciphers.size() != requestedCiphers.size()) {
+                List<String> skipped = new ArrayList<String>(requestedCiphers);
+                skipped.removeAll(ciphers);
+                log.debug(sm.getString("jsse.unsupported_ciphers", skipped));
             }
-        } else {
-            enabledCiphers = sslProxy.getDefaultCipherSuites();
         }
 
-        return enabledCiphers;
+        return ciphers.toArray(new String[ciphers.size()]);
     }
 
     /*
@@ -527,8 +535,12 @@ public class JSSESocketFactory
 
             // Determine which cipher suites to enable
             String requestedCiphers = (String)attributes.get("ciphers");
-            enabledCiphers = getEnabledCiphers(requestedCiphers,
-                                               sslProxy.getSupportedCipherSuites());
+            if (ALLOW_ALL_SUPPORTED_CIPHERS.equals(requestedCiphers)) {
+                enabledCiphers = sslProxy.getSupportedCipherSuites();
+            } else {
+                enabledCiphers = getEnabledCiphers(requestedCiphers,
+                        sslProxy.getSupportedCipherSuites());
+            }
 
             allowUnsafeLegacyRenegotiation =
                 "true".equals(attributes.get("allowUnsafeLegacyRenegotiation"));
@@ -714,7 +726,7 @@ public class JSSESocketFactory
      */
     protected void setEnabledProtocols(SSLServerSocket socket, String []protocols){
         if (protocols == null) {
-            socket.setEnabledProtocols(DEFAULT_SERVER_PROTOCOLS);
+            socket.setEnabledProtocols(defaultServerProtocols);
         } else {
             socket.setEnabledProtocols(protocols);
         }
@@ -738,7 +750,7 @@ public class JSSESocketFactory
         }
 
         if (requestedProtocols == null) {
-            return DEFAULT_SERVER_PROTOCOLS;
+            return defaultServerProtocols;
         }
 
         String[] requestedProtocolsArr = requestedProtocols.split(",");

Modified: tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/res/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/res/LocalStrings.properties?rev=1639415&r1=1639414&r2=1639415&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/res/LocalStrings.properties (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/tomcat/util/net/jsse/res/LocalStrings.properties Thu Nov 13 17:39:41 2014
@@ -17,8 +17,13 @@ jsse.alias_no_key_entry=Alias name {0} d
 jsse.keystore_load_failed=Failed to load keystore type {0} with path {1} due to {2}
 jsse.invalid_truststore_password=The provided trust store password could not be used to unlock and/or validate the trust store. Retrying to access the trust store with a null password which will skip validation.
 jsse.invalidTrustManagerClassName=The trustManagerClassName provided [{0}] does not implement javax.net.ssl.TrustManager
-jsse.excludeDefaultProtocol=The SSL protocol [{0}] which is enabled by default in this JRE was excluded from the defaults used by Tomcat
+jsse.requested_ciphers_not_supported=None of the ciphers specified are supported by the SSL engine : {0}
+jsse.enableable_ciphers=Specified SSL ciphers that are supported and enableable are : {0}
+jsse.unsupported_ciphers=Some specified SSL ciphers are not supported by the SSL engine : {0}
 jsse.unsupportedProtocol=The specified SSL protocol [{0}] is not supported
+jsse.excludeDefaultProtocol=The SSL protocol [{0}] which is enabled by default in this JRE was excluded from the defaults used by Tomcat
+jsse.noDefaultCiphers=Unable to determine a default for ciphers. Set an explicit value to ensure the connector can start.
+jsse.noDefaultProtocols=Unable to determine a default for sslEnabledProtocols. Set an explicit value to ensure the connector can start.
 jsseSupport.clientCertError=Error trying to obtain a certificate from the client
 jseeSupport.certTranslationError=Error translating certificate [{0}]
 jsseSupport.noCertWant=No client certificate sent for want

Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=1639415&r1=1639414&r2=1639415&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Thu Nov 13 17:39:41 2014
@@ -59,6 +59,10 @@
         Based upon a patch by Marcel &#352;ebek. (schultz/jfclere)
       </fix>
       <fix>
+        <bug>56780</bug>: Enable Tomcat to start when using SSL with an IBM JRE
+        in strict SP800-131a mode. (markt/kkolinko) 
+      </fix>
+      <fix>
         <bug>57102</bug>: Fix bug that meant sslEnabledProtocols setting was not
         recognised for the HTTPS NIO connector. (markt)
       </fix>
@@ -79,6 +83,11 @@
         <bug>57116</bug>: Do not fallback to default protocol list for HTTPS BIO
         connector if <code>sslEnabledProtocols</code> has no matches. (markt)
       </fix>
+      <update>
+        Align calculation of default ciphers and default protocols for JSSE
+        HTTPS connectors with Tomcat 7 which allows for per connector defaults
+        based on the choice of <code>sslProtocol</code>. (markt/kkolinko)
+      </update>
     </changelog>
   </subsection>
   <subsection name="Web applications">

Modified: tomcat/tc6.0.x/trunk/webapps/docs/config/http.xml
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/config/http.xml?rev=1639415&r1=1639414&r2=1639415&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/config/http.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/config/http.xml Thu Nov 13 17:39:41 2014
@@ -788,11 +788,15 @@
       </attribute>
 
     <attribute name="ciphers" required="false">
-      <p>The comma separated list of encryption ciphers that this socket is 
-      allowed to use. By default, the default ciphers for the JVM will be used.
-      Note that this usually means that the weak export grade ciphers will be
-      included in the list of available ciphers. The ciphers are specified using
-      the JSSE cipher naming convention.</p>
+      <p>The comma separated list of encryption ciphers to support for HTTPS
+      connections. If specified, only the ciphers that are listed and supported
+      by the SSL implementation will be used. By default, the default ciphers
+      for the JVM will be used. Note that this usually means that the weak
+      export grade ciphers will be included in the list of available ciphers.
+      The ciphers are specified using the JSSE cipher naming convention. The
+      special value of <code>ALL</code> will enable all supported ciphers. This
+      will include many that are not secure. <code>ALL</code> is intended for
+      testing purposes only.</p>
     </attribute>
 
     <attribute name="keyAlias" required="false">
@@ -861,8 +865,9 @@
     <attribute name="sslEnabledProtocols" required="false">
       <p>The comma separated list of SSL protocols to support for HTTPS
       connections. If specified, only the protocols that are listed and
-      supported by the SSL implementation will be enabled. If not specified,
-      the JVM default is used. The permitted values may be obtained from the
+      supported by the SSL implementation will be enabled.  If not specified,
+      the JVM default (excluding SSLv2 and SSLv3 if the JVM enables either or
+      both of them by default) is used. The permitted values may be obtained from the
       JVM documentation for the allowed values for 
       <code>SSLSocket.setEnabledProtocols()</code> e.g.
       <a href="http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html#jssenames">



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