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 ) {
}
}