Author: markt
Date: Sun Aug 10 10:24:51 2008
New Revision: 684559
URL: http://svn.apache.org/viewvc?rev=684559&view=rev
Log:
Fix for https://issues.apache.org/bugzilla/show_bug.cgi?id=45528. Test the SSL
socket before returning it to make sure the specified certificate will work
with the specified ciphers.
Modified:
tomcat/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java
Modified:
tomcat/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java?rev=684559&r1=684558&r2=684559&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/jsse/JSSESocketFactory.java
Sun Aug 10 10:24:51 2008
@@ -26,6 +26,7 @@
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
+import java.net.SocketTimeoutException;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.CRL;
@@ -692,7 +693,7 @@
* Configures the given SSL server socket with the requested cipher suites,
* protocol versions, and need for client authentication
*/
- private void initServerSocket(ServerSocket ssocket) {
+ private void initServerSocket(ServerSocket ssocket) throws IOException {
SSLServerSocket socket = (SSLServerSocket) ssocket;
@@ -704,9 +705,48 @@
setEnabledProtocols(socket, getEnabledProtocols(socket,
requestedProtocols));
+ // Check the SSL config is OK
+ checkSocket(ssocket);
+
// we don't know if client auth is needed -
// after parsing the request we may re-handshake
configureClientAuth(socket);
}
+ /**
+ * Checks that the cetificate is compatible with the enabled cipher suites.
+ * If we don't check now, the JIoEndpoint can enter a nasty logging loop.
+ * See bug 45528.
+ */
+ private void checkSocket(ServerSocket socket) throws IOException {
+ int timeout = socket.getSoTimeout();
+
+ socket.setSoTimeout(1);
+ Socket s = null;
+ try {
+ s = socket.accept();
+ // No expecting to get here but if we do, at least we know things
+ // are working.
+ } catch (SSLException ssle) {
+ // Cert doesn't match ciphers
+ IOException ioe =
+ new IOException("Certificate / cipher mismatch");
+ ioe.initCause(ssle);
+ throw ioe;
+ } catch (SocketTimeoutException ste) {
+ // Expected - do nothing
+ } finally {
+ // In case we actually got a connection - close it.
+ if (s != null) {
+ try {
+ s.close();
+ } catch (IOException ioe) {
+ // Ignore
+ }
+ }
+ // Reset the timeout
+ socket.setSoTimeout(timeout);
+ }
+
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]