Tomcat 7 HTTPS: APR y JSSE

Tomcat ofrece dos formas de trabajar con SSL: JSSE y APR. La implementación de SSL basada en JSSE forma parte del Java Runtime (desde la versión 1.4) mientras que con el conector nativo APR se utiliza el motor de OpenSSL.

Por defecto, Tomcat 7 utiliza APR, cuya principal diferencia en la configuración respecto a JSSE es que APR utiliza archivos de certificado normales (.crt,.key) en lugar de almacenarlos en un keystore. De este modo, si usamos APR deberemos especificar la ruta al fichero de certificado, al fichero de la llave privada y al de los certificados raíz/intermedios. Si en cambio usamos JSSE simplemente configuraremos la ruta al Keystore.

Ejemplo de configuración con APR:

<Connector
protocol="HTTP/1.1"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
SSLCertificateFile="/usr/local/ssl/server.crt"
SSLCertificateKeyFile="/usr/local/ssl/server.pem"
SSLVerifyClient="optional" SSLProtocol="TLSv1"/>

Ejemplo de configuración con JSSE:

<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="/usr/local/ssl/.keystore" keystorePass="mipassword"
clientAuth="false" sslProtocol="TLS"/>

Como véis, en uno especificamos los ficheros de certificado y en otro el Keystore, además, cambia el protocolo del conector según sea APR o JSSE. Si por ejemplo no cambiamos el protocolo de conector y usamos HTTP/1.1 en una configuración JSSE con keystore, al arrancar, Tomcat soltará el siguiente error en el archivo de log catalina.out:

SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-ap
r-8443"]
java.lang.Exception: Connector attribute SSLCertificateFile must be defined when
using SSL with APR
at org.apache.tomcat.util.net.AprEndpoint.bind(AprEndpoint.java:484)
at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:554.
[...]