You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by cr...@locus.apache.org on 2000/08/12 00:44:40 UTC

cvs commit: jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/net DefaultServerSocketFactory.java SSLSocketFactory.java ServerSocketFactory.java

craigmcc    00/08/11 15:44:40

  Added:       catalina/src/share/org/apache/catalina/net
                        DefaultServerSocketFactory.java
                        SSLSocketFactory.java ServerSocketFactory.java
  Log:
  Migrate to Tomcat 4.0.
  
  Revision  Changes    Path
  1.1                  jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/net/DefaultServerSocketFactory.java
  
  Index: DefaultServerSocketFactory.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/net/DefaultServerSocketFactory.java,v 1.1 2000/08/11 22:44:39 craigmcc Exp $
   * $Revision: 1.1 $
   * $Date: 2000/08/11 22:44:39 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:  
   *       "This product includes software developed by the 
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */ 
  
  
  package org.apache.catalina.net;
  
  import java.io.*;
  import java.net.*;
  
  /**
   * Default server socket factory. Doesn't do much except give us
   * plain ol' server sockets.
   *
   * @author db@eng.sun.com
   * @author Harish Prabandham
   */
  
  // Default implementation of server sockets.
  
  //
  // WARNING: Some of the APIs in this class are used by J2EE. 
  // Please talk to harishp@eng.sun.com before making any changes.
  //
  class DefaultServerSocketFactory extends ServerSocketFactory {
  
      DefaultServerSocketFactory () {
          /* NOTHING */
      }
  
      public ServerSocket createSocket (int port)
      throws IOException {
          return  new ServerSocket (port);
      }
  
      public ServerSocket createSocket (int port, int backlog)
      throws IOException {
          return new ServerSocket (port, backlog);
      }
  
      public ServerSocket createSocket (int port, int backlog,
          InetAddress ifAddress)
      throws IOException {
          return new ServerSocket (port, backlog, ifAddress);
      }
  }
  
  
  
  1.1                  jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/net/SSLSocketFactory.java
  
  Index: SSLSocketFactory.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:  
   *       "This product includes software developed by the 
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */ 
  package org.apache.catalina.net;
  
  import java.io.*;
  import java.net.*;
  
  import java.security.KeyStore;
  
  import java.security.Security;
  import javax.net.ServerSocketFactory;
  import javax.net.ssl.SSLServerSocket;
  import javax.net.ssl.SSLSocket;
  import javax.net.ssl.SSLServerSocketFactory;
  import javax.net.ssl.HandshakeCompletedListener;
  import javax.net.ssl.HandshakeCompletedEvent;
  
  /*
    1. Add Jsse's jars into jre/lib/ext
    2. Edit java.security, add
         security.provider.2=com.sun.net.ssl.internal.ssl.Provider
    3. keytool -genkey -alias tomcat -keyalg RSA
       Use "changeit" as password ( this is the default we use )
   */
  
  /**
   * SSL server socket factory. It _requires_ a valid RSA key and
   * JSSE. 
   *
   * @author Harish Prabandham
   * @author Costin Manolache
   */
  public class SSLSocketFactory
      extends org.apache.catalina.net.ServerSocketFactory
  {
      private String keystoreType;
  
      static String defaultKeystoreType = "JKS";
      static String defaultProtocol = "TLS";
      static String defaultAlgorithm = "SunX509";
      static boolean defaultClientAuth = false;
  
      private boolean clientAuth = false;
      private SSLServerSocketFactory sslProxy = null;
      
      // defaults
      static String defaultKeystoreFile=System.getProperty("user.home") +
  	"/.keystore";
      static String defaultKeyPass="changeit";
  
      
      public SSLSocketFactory () {
      }
  
      public ServerSocket createSocket (int port)
  	throws IOException
      {
  	if( sslProxy == null ) initProxy();
  	ServerSocket socket = 
  	    sslProxy.createServerSocket(port);
  	initServerSocket(socket);
  	return socket;
      }
      
      public ServerSocket createSocket (int port, int backlog)
  	throws IOException
      {
  	if( sslProxy == null ) initProxy();
  	ServerSocket socket = 
  	    sslProxy.createServerSocket(port, backlog);
  	initServerSocket(socket);
  	return socket;
      }
      
      public ServerSocket createSocket (int port, int backlog,
  				      InetAddress ifAddress)
  	throws IOException
      {	
  	if( sslProxy == null ) initProxy();
  	ServerSocket socket = 
  	    sslProxy.createServerSocket(port, backlog, ifAddress);
  	initServerSocket(socket);
  	return socket;
      }
      
      
      // -------------------- Internal methods
      /** Read the keystore, init the SSL socket factory
       */
      private void initProxy() throws IOException {
  	try {
  	    /** You should have this in java.security, but
  		can't hurt to double check
  	    */
  	    Security.addProvider (new sun.security.provider.Sun());
  	    Security.addProvider (new com.sun.net.ssl.internal.ssl.Provider());
  
  	    // Please don't change the name of the attribute - other
  	    // software may depend on it ( j2ee for sure )
  	    String keystoreFile=(String)attributes.get("keystore");
  	    if( keystoreFile==null) keystoreFile=defaultKeystoreFile;
  
  	    String keystoreType=(String)attributes.get("keystoreType");
  	    if( keystoreType==null) keystoreType=defaultKeystoreType;
  
  	    //determine whether we want client authentication
  	    // the presence of the attribute enables client auth
  	    clientAuth = null != (String)attributes.get("clientauth");
  
  	    String keyPass=(String)attributes.get("keypass");
  	    if( keyPass==null) keyPass=defaultKeyPass;
  
  	    //protocol for the SSL ie - TLS, SSL v3 etc.
  	    String protocol = (String)attributes.get("protocol");
  	    if(protocol == null) protocol = defaultProtocol;
  	    
  	    //Algorithm used to encode the certificate ie - SunX509
  	    String algorithm = (String)attributes.get("algorithm");
  	    if(algorithm == null) algorithm = defaultAlgorithm;
  	    
  	    // You can't use ssl without a server certificate.
  	    // Create a KeyStore ( to get server certs )
  	    KeyStore kstore = initKeyStore( keystoreFile, keyPass );
  	    
  	    // Create a SSLContext ( to create the ssl factory )
  	    // This is the only way to use server sockets with JSSE 1.0.1
  	    com.sun.net.ssl.SSLContext context = 
  		com.sun.net.ssl.SSLContext.getInstance(protocol); //SSL
  
  	    // Key manager will extract the server key
  	    com.sun.net.ssl.KeyManagerFactory kmf = 
  		com.sun.net.ssl.KeyManagerFactory.getInstance(algorithm);
  	    kmf.init( kstore, keyPass.toCharArray());
  
  	    // XXX I don't know if this is needed
  //  	    com.sun.net.ssl.TrustManagerFactory tmf = 
  //  		com.sun.net.ssl.TrustManagerFactory.getInstance("SunX509");
  // 		tmf.init(kstore);
  
  	    // init context with the key managers
  	    context.init(kmf.getKeyManagers(), null,
  			 new java.security.SecureRandom());
  
  	    // create proxy
  	    sslProxy = context.getServerSocketFactory();
  
  	    return;
  	} catch(Exception e) {
  	    if( e instanceof IOException )
  		throw (IOException)e;
  	    throw new IOException(e.getMessage());
  	}
      }
  
      /** Set server socket properties ( accepted cipher suites, etc)
       */
      private void initServerSocket(ServerSocket ssocket) {
  	SSLServerSocket socket=(SSLServerSocket)ssocket;
  
  	// We enable all cipher suites when the socket is
  	// connected - XXX make this configurable 
  	String cipherSuites[] = socket.getSupportedCipherSuites();
  	socket.setEnabledCipherSuites(cipherSuites);
  
  	// we don't know if client auth is needed -
  	// after parsing the request we may re-handshake
  	socket.setNeedClientAuth(clientAuth);
      }
  
      private KeyStore initKeyStore( String keystoreFile,
  				   String keyPass)
  	throws IOException
      {
  	InputStream istream = null;
  	try {
  	    KeyStore kstore=KeyStore.getInstance( keystoreType );
  	    istream = new FileInputStream(keystoreFile);
  	    kstore.load(istream, keyPass.toCharArray());
  	    return kstore;
  	}
  	catch (FileNotFoundException fnfe) {
  	    throw fnfe;
  	}
  	catch (IOException ioe) {
  	    throw ioe;	    
  	}
  	catch(Exception ex) {
  	    throw new IOException( "Exception trying to load keystore " +
  				   keystoreFile + ": " + ex.getMessage() );
  	}
      }
  
      
  }
  
  
  
  1.1                  jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/net/ServerSocketFactory.java
  
  Index: ServerSocketFactory.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:  
   *       "This product includes software developed by the 
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written 
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */ 
  
  
  package org.apache.catalina.net;
  
  import java.io.*;
  import java.net.*;
  import java.util.Hashtable;
  
  /**
   * This class creates server sockets.  It may be subclassed by other
   * factories, which create particular types of server sockets.  This
   * provides a general framework for the addition of public socket-level
   * functionality.  It it is the server side analogue of a socket factory,
   * and similarly provides a way to capture a variety of policies related
   * to the sockets being constructed.
   *
   * <P> Like socket factories, Server Socket factory instances have two
   * categories of methods.  First are methods used to create sockets.
   * Second are methods which set properties used in the production of
   * sockets, such as networking options.  There is also an environment
   * specific default server socket factory; frameworks will often use
   * their own customized factory.
   * 
   * <P><hr><em> It may be desirable to move this interface into the
   * <b>java.net</b> package, so that is not an extension but the preferred
   * interface.  Should this be serializable, making it a JavaBean which can
   * be saved along with its networking configuration?
   * </em>   
   *
   * @author db@eng.sun.com
   * @author Harish Prabandham
   */
  public abstract class ServerSocketFactory implements Cloneable {
  
      //
      // NOTE:  JDK 1.1 bug in class GC, this can get collected
      // even though it's always accessible via getDefault().
      //
  
      private static ServerSocketFactory theFactory;
      protected Hashtable attributes=new Hashtable();
  
      /**
       * Constructor is used only by subclasses.
       */
  
      protected ServerSocketFactory () {
          /* NOTHING */
      }
  
      /** General mechanism to pass attributes from the
       *  ServerConnector to the socket factory.
       *
       *  Note that the "prefered" mechanism is to
       *  use bean setters and explicit methods, but
       *  this allows easy configuration via server.xml
       *  or simple Properties
       */
      public void setAttribute( String name, Object value ) {
  	if( name!=null && value !=null)
  	    attributes.put( name, value );
      }
      
      /**
       * Returns a copy of the environment's default socket factory.
       */
      public static ServerSocketFactory getDefault () {
          //
          // optimize typical case:  no synch needed
          //
  
          if (theFactory == null) {
              synchronized (ServerSocketFactory.class) {
                  //
                  // Different implementations of this method could
                  // work rather differently.  For example, driving
                  // this from a system property, or using a different
                  // implementation than JavaSoft's.
                  //
  
                  theFactory = new DefaultServerSocketFactory ();
              }
          }
  
          try {
              return (ServerSocketFactory) theFactory.clone ();
          } catch (CloneNotSupportedException e) {
              throw new RuntimeException (e.getMessage ());
          }
      }
  
      /**
       * Returns a server socket which uses all network interfaces on
       * the host, and is bound to a the specified port.  The socket is
       * configured with the socket options (such as accept timeout)
       * given to this factory.
       *
       * @param port the port to listen to
       * @exception IOException for networking errors
       * @exception InstantiationException for construction errors
       */
      public abstract ServerSocket createSocket (int port)
      throws IOException, InstantiationException;
  
      /**
       * Returns a server socket which uses all network interfaces on
       * the host, is bound to a the specified port, and uses the 
       * specified connection backlog.  The socket is configured with
       * the socket options (such as accept timeout) given to this factory.
       *
       * @param port the port to listen to
       * @param backlog how many connections are queued
       * @exception IOException for networking errors
       * @exception InstantiationException for construction errors
       */
  
      public abstract ServerSocket createSocket (int port, int backlog)
      throws IOException, InstantiationException;
  
      /**
       * Returns a server socket which uses only the specified network
       * interface on the local host, is bound to a the specified port,
       * and uses the specified connection backlog.  The socket is configured
       * with the socket options (such as accept timeout) given to this factory.
       *
       * @param port the port to listen to
       * @param backlog how many connections are queued
       * @param ifAddress the network interface address to use
       * @exception IOException for networking errors
       * @exception InstantiationException for construction errors
       */
  
      public abstract ServerSocket createSocket (int port,
          int backlog, InetAddress ifAddress)
      throws IOException, InstantiationException;
  
      public void initSocket( Socket s ) {
      }
  }