Author: markt
Date: Sun May 24 23:47:46 2009
New Revision: 778258

URL: http://svn.apache.org/viewvc?rev=778258&view=rev
Log:
Port fix for bug 45528 to TC4/TC5. Needed to make use of JdkCompat to allow for 
unlikely (but possible) TC4 on 1.3 JVM.

Modified:
    
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/compat/Jdk14Compat.java
    
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/compat/JdkCompat.java
    
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSE13SocketFactory.java
    
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSE14SocketFactory.java
    
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java
    
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/res/LocalStrings.properties

Modified: 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/compat/Jdk14Compat.java
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/util/java/org/apache/tomcat/util/compat/Jdk14Compat.java?rev=778258&r1=778257&r2=778258&view=diff
==============================================================================
--- 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/compat/Jdk14Compat.java
 (original)
+++ 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/compat/Jdk14Compat.java
 Sun May 24 23:47:46 2009
@@ -20,8 +20,11 @@
 import java.io.File;
 import java.io.IOException;
 import java.net.MalformedURLException;
+import java.net.ServerSocket;
 import java.net.URL;
 
+import javax.net.ServerSocketFactory;
+
 //import org.apache.commons.logging.Log;
 //import org.apache.commons.logging.LogFactory;
 
@@ -118,4 +121,12 @@
         wrapper.initCause(wrapped);
     }
 
+    /**
+     * Obtain an unbound socket from the ServerSocketFactory. Return null if
+     * unbound sockets cannot be created.
+     */
+    public ServerSocket getUnboundSocket(ServerSocketFactory ssf)
+            throws IOException {
+        return ssf.createServerSocket();
+    }
  }

Modified: 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/compat/JdkCompat.java
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/util/java/org/apache/tomcat/util/compat/JdkCompat.java?rev=778258&r1=778257&r2=778258&view=diff
==============================================================================
--- 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/compat/JdkCompat.java 
(original)
+++ 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/compat/JdkCompat.java 
Sun May 24 23:47:46 2009
@@ -22,9 +22,12 @@
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.net.MalformedURLException;
+import java.net.ServerSocket;
 import java.net.URL;
 import java.util.Vector;
 
+import javax.net.ServerSocketFactory;
+
 
 /**
  *  General-purpose utility to provide backward-compatibility and JDK
@@ -219,4 +222,13 @@
         // do nothing
     }
 
+    /**
+     * Obtain an unbound socket from the ServerSocketFactory. Return null if
+     * unbound sockets cannot be created.
+     */
+    public ServerSocket getUnboundSocket(ServerSocketFactory ssf)
+            throws IOException {
+        return null;
+    }
+
  }

Modified: 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSE13SocketFactory.java
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSE13SocketFactory.java?rev=778258&r1=778257&r2=778258&view=diff
==============================================================================
--- 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSE13SocketFactory.java
 (original)
+++ 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSE13SocketFactory.java
 Sun May 24 23:47:46 2009
@@ -129,6 +129,9 @@
             enabledCiphers = getEnabledCiphers(requestedCiphers,
                      sslProxy.getSupportedCipherSuites());
 
+            // Check the SSL config is OK
+            checkConfig();
+
         } catch(Exception e) {
             if( e instanceof IOException )
                 throw (IOException)e;

Modified: 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSE14SocketFactory.java
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSE14SocketFactory.java?rev=778258&r1=778257&r2=778258&view=diff
==============================================================================
--- 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSE14SocketFactory.java
 (original)
+++ 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSE14SocketFactory.java
 Sun May 24 23:47:46 2009
@@ -120,6 +120,9 @@
             enabledCiphers = getEnabledCiphers(requestedCiphers,
                                                
sslProxy.getSupportedCipherSuites());
 
+            // Check the SSL config is OK
+            checkConfig();
+
         } catch(Exception e) {
             if( e instanceof IOException )
                 throw (IOException)e;

Modified: 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java?rev=778258&r1=778257&r2=778258&view=diff
==============================================================================
--- 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java
 (original)
+++ 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java
 Sun May 24 23:47:46 2009
@@ -34,6 +34,9 @@
 import javax.net.ssl.SSLServerSocketFactory;
 import javax.net.ssl.SSLSocket;
 
+import org.apache.tomcat.util.compat.JdkCompat;
+import org.apache.tomcat.util.res.StringManager;
+
 /*
   1. Make the JSSE's jars available, either as an installed
      extension (copy them into jre/lib/ext) or by adding
@@ -54,6 +57,9 @@
 public abstract class JSSESocketFactory
     extends org.apache.tomcat.util.net.ServerSocketFactory
 {
+    private static StringManager sm =
+        StringManager.getManager("org.apache.tomcat.util.net.jsse.res");
+
     // defaults
     static String defaultProtocol = "TLS";
     static String defaultAlgorithm = "SunX509";
@@ -371,4 +377,53 @@
         configureClientAuth(socket);
     }
 
+    /**
+     * Checks that the certificate is compatible with the enabled cipher 
suites.
+     * If we don't check now, the JIoEndpoint can enter a nasty logging loop.
+     * See bug 45528.
+     */
+    protected void checkConfig() throws IOException {
+        // Create an unbound server socket
+        ServerSocket socket =
+            JdkCompat.getJdkCompat().getUnboundSocket(sslProxy);
+        if (socket == null) {
+            // Can create unbound sockets (1.3 JVM) - can't test the connection
+            return;
+        }
+        initServerSocket(socket);
+
+        try {
+            // Set the timeout to 1ms as all we care about is if it throws an
+            // SSLException on accept. 
+            socket.setSoTimeout(1);
+
+            socket.accept();
+            // Will never get here - no client can connect to an unbound port
+        } catch (SSLException ssle) {
+            // SSL configuration is invalid. Possibly cert doesn't match 
ciphers
+            IOException ioe = new IOException(sm.getString(
+                    "jsse.invalid_ssl_conf", ssle.getMessage()));
+            JdkCompat.getJdkCompat().chainException(ioe, ssle);
+            throw ioe;
+        } catch (Exception e) {
+            /*
+             * Possible ways of getting here
+             * socket.accept() throws a SecurityException
+             * socket.setSoTimeout() throws a SocketException
+             * socket.accept() throws some other exception (after a JDK change)
+             *      In these cases the test won't work so carry on - 
essentially
+             *      the behaviour before this patch
+             * socket.accept() throws a SocketTimeoutException
+             *      In this case all is well so carry on
+             */
+        } finally {
+            // Should be open here but just in case
+            try {
+                socket.close();
+            } catch (IOException ioe) {
+                // Ignore
+            }
+        }
+        
+    }
 }

Modified: 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/res/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/res/LocalStrings.properties?rev=778258&r1=778257&r2=778258&view=diff
==============================================================================
--- 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/res/LocalStrings.properties
 (original)
+++ 
tomcat/connectors/trunk/util/java/org/apache/tomcat/util/net/jsse/res/LocalStrings.properties
 Sun May 24 23:47:46 2009
@@ -14,3 +14,4 @@
 # limitations under the License.
 
 jsse.alias_no_key_entry=Alias name {0} does not identify a key entry
+jsse.invalid_ssl_conf=SSL configuration is invalid due to {0}



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

Reply via email to