Tomcat y SSL
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 :
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