You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by bi...@apache.org on 2003/03/29 08:37:25 UTC

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

billbarker    2003/03/28 23:37:25

  Modified:    util/java/org/apache/tomcat/util/net/jsse JSSE14Support.java
                        JSSESupport.java
  Log:
  Yet more improvements for JSSE 1.1.x
  
  The timeout is still problematic.  The settings here work-for-me, but I'm open to tweaking.  The old settings were too strict, since they didn't give enough time for non-MSIE browsers to finish the client interaction.  The new settings are still a little slow however.
  
  The main fix is that since JSSE 1.1.x already computes X509Certificates, we don't have to waste cycles computing them again.
  
  Revision  Changes    Path
  1.2       +36 -7     jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/jsse/JSSE14Support.java
  
  Index: JSSE14Support.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/net/jsse/JSSE14Support.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- JSSE14Support.java	17 Mar 2003 04:04:07 -0000	1.1
  +++ JSSE14Support.java	29 Mar 2003 07:37:25 -0000	1.2
  @@ -64,13 +64,15 @@
   import java.net.*;
   import java.util.Vector;
   import java.security.cert.CertificateFactory;
  +import java.security.cert.X509Certificate;
  +import java.security.cert.Certificate;
   import javax.net.ssl.SSLSession;
   import javax.net.ssl.SSLSocket;
   import javax.net.ssl.SSLException;
   import javax.net.ssl.HandshakeCompletedListener;
   import javax.net.ssl.HandshakeCompletedEvent;
   import java.security.cert.CertificateFactory;
  -import javax.security.cert.X509Certificate;
  +
   
   /* JSSESupport
   
  @@ -112,12 +114,14 @@
           throws IOException {
           InputStream in = socket.getInputStream();
           int oldTimeout = socket.getSoTimeout();
  -        socket.setSoTimeout(100);
  +        socket.setSoTimeout(1000);
           byte[] b = new byte[0];
           listener.reset();
           socket.startHandshake();
  -        int maxTries = 50; // 50 * 100 = example 5 second rehandshake timeout
  +        int maxTries = 60; // 60 * 1000 = example 1 minute time out
           for (int i = 0; i < maxTries; i++) {
  +	    if(logger.isTraceEnabled())
  +		logger.trace("Reading for try #" +i);
               try {
                   int x = in.read(b);
               } catch(SSLException sslex) {
  @@ -136,14 +140,39 @@
           }
       }
   
  +    protected X509Certificate [] getX509Certificates(SSLSession session) 
  +	throws IOException {
  +	Certificate [] certs = session.getPeerCertificates();
  +	X509Certificate [] x509Certs = new X509Certificate[certs.length];
  +	for(int i=0; i < certs.length; i++) {
  +	    if( certs[i] instanceof X509Certificate ) {
  +		// always currently true with the JSSE 1.1.x
  +		x509Certs[i] = (X509Certificate)certs[i];
  +	    } else {
  +		try {
  +		    byte [] buffer = certs[i].getEncoded();
  +		    CertificateFactory cf =
  +			CertificateFactory.getInstance("X.509");
  +		    ByteArrayInputStream stream =
  +			new ByteArrayInputStream(buffer);
  +		    x509Certs[i] = (X509Certificate)
  +			cf.generateCertificate(stream);
  +		} catch(Exception ex) { 
  +		    logger.info("Error translating cert " + certs[i], ex);
  +		    return null;
  +		}
  +	    }
  +	}
  +	if(x509Certs.length < 1)
  +	    return null;
  +	return x509Certs;
  +    }
  +
  +
       private static class Listener implements HandshakeCompletedListener {
           volatile boolean completed = false;
           public void handshakeCompleted(HandshakeCompletedEvent event) {
               completed = true;
  -            if(logger.isTraceEnabled()) 
  -                logger.trace("SSL handshake done : Socket = " +
  -                             event.getSocket() );
  -
           }
           void reset() {
               completed = false;
  
  
  
  1.5       +47 -38    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.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- JSSESupport.java	17 Mar 2003 04:04:07 -0000	1.4
  +++ JSSESupport.java	29 Mar 2003 07:37:25 -0000	1.5
  @@ -84,6 +84,8 @@
   */
   
   class JSSESupport implements SSLSupport {
  +    private org.apache.commons.logging.Log log =
  +	org.apache.commons.logging.LogFactory.getLog(JSSESupport.class);
   
       protected SSLSocket ssl;
   
  @@ -105,51 +107,58 @@
           return getPeerCertificateChain(false);
       }
   
  +    protected java.security.cert.X509Certificate [] 
  +	getX509Certificates(SSLSession session) throws IOException {
  +        X509Certificate jsseCerts[] = null;
  +	jsseCerts = session.getPeerCertificateChain();
  +
  +	if(jsseCerts == null)
  +	    jsseCerts = new X509Certificate[0];
  +	java.security.cert.X509Certificate [] x509Certs =
  +	    new java.security.cert.X509Certificate[jsseCerts.length];
  +	for (int i = 0; i < x509Certs.length; i++) {
  +	    try {
  +		byte buffer[] = jsseCerts[i].getEncoded();
  +		CertificateFactory cf =
  +		    CertificateFactory.getInstance("X.509");
  +		ByteArrayInputStream stream =
  +		    new ByteArrayInputStream(buffer);
  +		x509Certs[i] = (java.security.cert.X509Certificate)
  +		    cf.generateCertificate(stream);
  +		if(log.isTraceEnabled())
  +		    log.trace("Cert #" + i + " = " + x509Certs[i]);
  +	    } catch(Exception ex) {
  +		log.info("Error translating " + jsseCerts[i], ex);
  +		return null;
  +	    }
  +	}
  +	
  +	if ( x509Certs.length < 1 )
  +	    return null;
  +	return x509Certs;
  +    }
       public Object[] getPeerCertificateChain(boolean force)
           throws IOException {
           // Look up the current SSLSession
  -        SSLSession session = ssl.getSession();
  +	SSLSession session = ssl.getSession();
           if (session == null)
               return null;
   
           // Convert JSSE's certificate format to the ones we need
  -        X509Certificate jsseCerts[] = null;
  -        java.security.cert.X509Certificate x509Certs[] = null;
  -        try {
  -            try {
  -                jsseCerts = session.getPeerCertificateChain();
  -            } catch(Exception bex) {
  -                // ignore.
  -            }
  -            if (jsseCerts == null)
  -                jsseCerts = new X509Certificate[0];
  -            if(jsseCerts.length <= 0 && force) {
  -                session.invalidate();
  -                handShake();
  -                session = ssl.getSession();
  -                jsseCerts = session.getPeerCertificateChain();
  -                if(jsseCerts == null)
  -                    jsseCerts = new X509Certificate[0];
  -            }
  -            x509Certs =
  -              new java.security.cert.X509Certificate[jsseCerts.length];
  -            for (int i = 0; i < x509Certs.length; i++) {
  -                byte buffer[] = jsseCerts[i].getEncoded();
  -                CertificateFactory cf =
  -                  CertificateFactory.getInstance("X.509");
  -                ByteArrayInputStream stream =
  -                  new ByteArrayInputStream(buffer);
  -                x509Certs[i] = (java.security.cert.X509Certificate)
  -                  cf.generateCertificate(stream);
  -            }
  -        } catch (Throwable t) {
  -            return null;
  -        }
  -
  -        if ((x509Certs == null) || (x509Certs.length < 1))
  -            return null;
  -
  -        return x509Certs;
  +	X509Certificate [] jsseCerts = null;
  +	try {
  +	    jsseCerts = session.getPeerCertificateChain();
  +	} catch(Exception bex) {
  +	    // ignore.
  +	}
  +	if (jsseCerts == null)
  +	    jsseCerts = new X509Certificate[0];
  +	if(jsseCerts.length <= 0 && force) {
  +	    session.invalidate();
  +	    handShake();
  +	    session = ssl.getSession();
  +	}
  +        return getX509Certificates(session);
       }
   
       protected void handShake() throws IOException {
  
  
  

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