You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by bo...@apache.org on 2002/10/08 18:49:43 UTC

cvs commit: jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/jsse JSSESupport.java

bobh        2002/10/08 09:49:43

  Modified:    util/java/org/apache/tomcat/util/net/jsse JSSESupport.java
  Log:
  - fixes problem with JDK1.4's JSSE trying to negociate certs on a socket that has no data flowing
  
  Revision  Changes    Path
  1.2       +45 -0     jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/jsse/JSSESupport.java
  
  Index: JSSESupport.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/jsse/JSSESupport.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- JSSESupport.java	4 Oct 2002 20:03:10 -0000	1.1
  +++ JSSESupport.java	8 Oct 2002 16:49:43 -0000	1.2
  @@ -66,6 +66,8 @@
   import java.security.cert.CertificateFactory;
   import javax.net.ssl.SSLSession;
   import javax.net.ssl.SSLSocket;
  +import javax.net.ssl.HandshakeCompletedListener;
  +import javax.net.ssl.HandshakeCompletedEvent;
   import java.security.cert.CertificateFactory;
   import javax.security.cert.X509Certificate;
   
  @@ -127,6 +129,9 @@
   		session.invalidate();
   		ssl.setNeedClientAuth(true);
   		ssl.startHandshake();
  +		if ("1.4".equals(System.getProperty("java.specification.version"))) {
  +		    synchronousHandshake(ssl);
  +		}
   		session = ssl.getSession();
   		jsseCerts = session.getPeerCertificateChain();
   		if(jsseCerts == null)
  @@ -198,5 +203,45 @@
           }
           return buf.toString();
       }
  +
  +    /**
  +     * JSSE in JDK 1.4 has an issue/feature that requires us to do a
  +     * read() to get the client-cert.  As suggested by Andreas
  +     * Sterbenz
  +     */
  +    private static void synchronousHandshake(SSLSocket socket) 
  +        throws IOException {
  +        InputStream in = socket.getInputStream();
  +        int oldTimeout = socket.getSoTimeout();
  +        socket.setSoTimeout(100);
  +        Listener listener = new Listener();
  +        socket.addHandshakeCompletedListener(listener);
  +        byte[] b = new byte[0];
  +        socket.startHandshake();
  +        int maxTries = 50; // 50 * 100 = example 5 second rehandshake timeout
  +        for (int i = 0; i < maxTries; i++) {
  +            try {
  +                int x = in.read(b);
  +            } catch (SocketTimeoutException e) {
  +                // ignore
  +            }
  +            if (listener.completed) {
  +                break;
  +            }
  +        }
  +        socket.removeHandshakeCompletedListener(listener);
  +        socket.setSoTimeout(oldTimeout);
  +        if (listener.completed == false) {
  +            throw new SocketTimeoutException("SSL Cert handshake timeout");
  +        }
  +    }
  +
  +    private static class Listener implements HandshakeCompletedListener {
  +        volatile boolean completed = false;
  +        public void handshakeCompleted(HandshakeCompletedEvent event) {
  +            completed = true;
  +        }
  +    }
  +
   }
   
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>