Tomcat puede usar SSL directamente (mediante un conector HTTP soportanto SSL) o mediante un Apache capaz-SSL (Apache-SSL o apache+mod_ssl) con el conector mod_jk.
�Construir Tomcat con Soporte SSL
Si queremos reconstruir Tomcat con SSL, debemos tener cuidado con nuestro CLASSPATH. Yo utilizo la variable de entorno CLASSPATH para evitar conflictos con los jars. Una causa com�n de conflictos es con los analizadores XML (xerces & jaxp). Tomcat necesita un analizador XML reciente como xerces 1.1.2 de Apache o jaxp 1.0.1 de Sun.
En el momento de la construcci�n, (mediante ant), Tomcat chequear� algunas libs y luego incluir� varias opciones, posiblemente incluyendo SSL. Si tenemos los jars JSSE 1.0.2 en nuestro CLASSPATH, Tomcat se construir� con SSL (SSLSocketFactory). Tomcat usar� los jars de JSSE (jcert.jar, jsse.jar, jnet.jar). Este software podr�a no est�r incluido en Tomcat. Tendremos que ir a la home page de jsse y descargar el archivo necesario desde all�. Luego copiamos los tres ficheros jar dentro del classpath de librer�as en tiempo de ejecuci�n de Tomcat ($TOMCAT_HOME/lib).
�Tomcat con Apache y mod_jk
Si utilizamos Apache con SSL (Apache-SSL o apache+mod_ssl) y la directiva JkExtractSSL en httpd.conf, el conector apache mod_jk podr� pasar alguna informaci�n SSL a Tomcat. Esta informaci�n es:
Informacion | Comentario |
---|---|
HTTPS | apache redirecciona a tomcat desde un �rea SSL |
SSL_SESSION_ID | ID de sesi�n SSL |
SSL_CIPHER | SSL CIPHER usado |
SSL_CLIENT_CERT | Certificado de cliente SSL |
Como Apache-SSL y apache+mod_ssl usan diferentes variables de entorno, podemos seleccionar las variables SSL desde las siguientes variables JK:
- JkExtractSSL
- JkHTTPSIndicator
- JkSESSIONIndicator
- JkCIPHERIndicator
- JkCERTSIndicator
Aqu� tenemos un ejemplo de directivas para incluir en httpd.conf para usar con mod_ssl:
# Should mod_jk send SSL information to Tomcat (default is On) JkExtractSSL On # What is the indicator for SSL (default is HTTPS) JkHTTPSIndicator HTTPS # What is the indicator for SSL session (default is SSL_SESSION_ID) JkSESSIONIndicator SSL_SESSION_ID # What is the indicator for client SSL cipher suit (default is SSL_CIPHER) JkCIPHERIndicator SSL_CIPHER # What is the indicator for the client SSL certificated (default is SSL_CLIENT_CERT) JkCERTSIndicator SSL_CLIENT_CERT
Cuando usamos mod_jk con Apache & mod_ssl es esencial especificar "SSLOptions +StdEnvVars +ExportCertData" en el fichero httpd.conf.
De otro modo mod_ssl no producir� las variables de entorno necesarias para mod_jk.
Cuidado: incluso si mod_jk soporta ajp12 (la vieja versi�n de Apache JServ) y ajp13, s�lo ajp13 puede enviar informaci�n SSL a Tomcat.
�SSL via Apache
mod_jk parece soportar la directiva VirtualHost de Apache. Es especialmente �til cuando usamos apache+mod_ssl con tomcat.
Esta configuraci�n asegurar� f�cilmente nuestras aplicaciones web mediante soporte de Apache SSL. Solo hay que tener cuidado de configurar estas variables JK fuera de las directivas VirtualHost:
JkWorkersFile /etc/httpd/conf/workers.properties JkLogFile /var/log/httpd/mod_jk.log JkLogLevel warn
La redirecci�n JK podr�a configurarse en host virtuales: <virtualhost_default_:443>
<VirtualHost _default_:443> SSLEngine on SSLCipherSuite ALL:!ADH:!EXP56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL # other SSL stuff Alias /alesia "/var/tomcat/webapps/alesia" <Directory "/var/tomcat/webapps/alesia"> <Directory "/var/tomcat/webapps/alesia"></Directory> <Directory "/var/tomcat/webapps/alesia">Options Indexes FollowSymLinks </Directory> </Directory> JkMount /alesia/servlet/* ajp13 JkMount /alesia/*.jsp ajp13 <Location "/alesia/WEB-INF/"> </Location> <Location "/alesia/WEB-INF/"> AllowOverride None Deny from all </Location> </VirtualHost> <!-- <virtualhost _default_:443></virtualhost> -->
�SSL Directo
Si queremos que Tomcat sirva directamente HTTP/SSL (https), necesitamos crear un certificado SSL. Para m�s informaci�n sobre SSL y los certificados, te sugiero que eches un vistazo a OpenSSL (Implementaci�n Open Source SSL) y a mod_ssl (soporte de SSL para Apache).
�Verificar el Fichero de Configuraci�n server.xml de Tomcat
Para usar HTTP con el conector SSL en Tomcat, verificamos que est� activado en server.xml:
<Connector className="org.apache.tomcat.service.PoolTcpConnector"> <Parameter name="handler" value="org.apache.tomcat.service.http.HttpConnectionHandler"/> <Parameter name="port" value="8443"/> <Parameter name="socketFactory" value="org.apache.tomcat.net.SSLSocketFactory"/> <Parameter name="keystore" value="/var/tomcat/conf/keystore" /> <Parameter name="keypass" value="changeit"/> <Parameter name="clientAuth" value="true"/> </Connector>
En este ejemplo hemos indicado que el keystore es el fichero /var/tomcat/conf/keystore. La password del keystore es changeit y queremos que los clientes se autentifiquen.
�Generar un Certificado SSL (RSA) para Tomcat
Lo consegu� (al final) con mi IBM JDK 1.3 despu�s de :
- Los jars de jsse deben estar en el CLASSPATH y en $JAVA_HOME/jre/lib/ext (JAVA > 1.2)
- Desde el documento server.xml. Necesitamos_configurar un certificado de servidor si queremos que esto funcione, y necesitamos JSSE.
- A�adimos los jars de JSSE al CLASSPATH
- Editamos $JAVA_HOME/jre/lib/security/java.security
A�adimos security.provider.2=com.sun.net.ssl.internal.ssl.Provider - Hacemos: keytool -genkey -alias tomcat -keyalg RSA
RSA es esencial para trabajar con Netscape e IIS. Usamos "changeit" como password (o a�adimos atributos de keypass). No necesitamos firmar el certificado. Podemos configurar los par�metros del keystore y keypass si queremos cambiar el valor por defecto ($HOME/.keystore with changeit)
- Sugiero que instalemos jcert.jar, jnet.jar y jsse.jar en $JAVA_HOME/jre/lib/ext y luego los a�adamos a nuestro CLASSPATH export
CLASSPATH=$JAVA_HOME/jre/lib/ext/jcert.jar:$CLASSPATH export CLASSPATH=$JAVA_HOME/jre/lib/ext/jnet.jar:$CLASSPATH export CLASSPATH=$JAVA_HOME/jre/lib/ext/jsse.jar:$CLASSPATH
Tambi�n deber�amos copiar los ficheros jar en $TOMCAT_HOME/lib/ para que est�n bajo el CLASSPATH existente en la arrancada de Tomcat (tomcat.sh).
�Importar Certificados SSL
Es posible importar certificados con OpenSSL. Aqu� est�n los pasos necesarios para generar dichos certificados con OpenSSL:
- Para generar una nueva petici�n y una nueva clave:
openssl req -new -out REQ.pem -keyout KEY.pem
- Para generar un certificado x509 auto-firmado desde una petici�n de certificado usando una clave suministrada, y ver el texto desde la salida del certificado (que se pondr� en el fichero selfSign.pem;
openssl req -x509 -in REQ.pem -key KEY.pem -out CERT.pem
- Verificar que la firma es correcta sobre una petici�n de certificado:
openssl req -verify -in REQ.pem
- Verificar que la firma se hizo usando una clave p�blica especificada:
openssl req -verify -in REQ.pem -key KEY.pem
- Imprimir el contenido de una petici�n de certificado:
openssl req -text -in REQ.pem
- Importar el CERT en el keystore:
keytool -import -v -trustcacerts -alias tomcat -file CERT.pem