Apache SSL JBoss, securizar canal de comunicación Apache y JBoss mediante SSL

Recientemente un cliente ha pedido una instalación securizada en en todo el cirtucito de información, es decir:

todo sslUsualmente lo que se hace el configurar Apache con SSL y la comunicación interna entre Apache y JBoss se realiza con el protocolo AJP, de esta forma:

no todo sslEl protocolo AJP tiene como ventaja frente al http, que es una comunicación binaria en lugar de texto, este reduce el ancho de banda necesario para transmitir la misma información (se estima que se reduce el ancho de banda necesario en un 25%).

Lo que ocurre es que AJP no puede encriptarse, posiblemente en el futuro pero de momento no. Por tanto no nos queda más otra opción que conectar Apache con JBoss mediante http+SSL (https)

Para la securizar el canal se van a utilizar los certificados que ya está usado Apache para el SSL, entradas en el fichero httpd.conf:

SSLCertificateKeyFile => Clave privada
SSLCertificateFile => Certificado

Vamos al asunto, debemos tener instalado openssl y java (para la utilidad keytool). Comenzamos con la configuración JBOSS:

1-Crear versión certificado p12 para poder importar la clave privada en un keystore (se ha de poner un password, por ejemplo «clave» para que se lleve la clave privada):

Source   
openssl pkcs12 -export -in certificado.crt -inkey clave_privada.key -out cert_web.p12 -name "key_webserver"

2-Importar la clave privada (del *.p12) en un keystore (si no existe el keystore lo crea y solicita una clave para protegerlo, por ejemplo «clave»):

Source   
keytool -importkeystore -srckeystore cert_web.p12 -srcstoretype pkcs12 -destkeystore keystore.jks -deststoretype jks

3-Copiar el fichero keystore.jks (en todos los nodos de JBOSS) a:
${jboss.domain.config.dir}

4-Configurar conector (con el servidor parada), añadir en domain.xml (dentro del profile adecuado) o en standalone.xml justo despues de:

Source   
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
<connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp"/>

Lo siquiente:

Source   
<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" secure="true">
<ssl name="https" key-alias="key_webserver" password="clave" certificate-key-file="${jboss.domain.config.dir}/keystore.jks"/>
</connector>

5-Reiniciar todos los jboss y verificar que los puertos SSL están levantados (por ejemplo el puerto 8443):

Source   
netstat -anop | grep LISTEN | grep 8443

Hay que tener cuidado con los parámetros para que apunten al keystore, el password del mismo y el key alias.

Configuración Apache:
1-Si estamos trabajando con un cluster debemos tener activado el módulo mod_proxy_balancer y añadir (a modo de ejemplo):

Source   
SSLProxyEngine On
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://mycluster>
BalancerMember https://nodo1:8443 route=1
BalancerMember https://nodo2:8443 route=2
ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass /helloworld balancer://mycluster/helloworld
ProxyPass /ClusterWebApp balancer://mycluster/ClusterWebApp

2-Si nuestra instalación es algo más sencillo sería algo del tipo.

Source   
#versión no cluster
SSLProxyEngine On
ProxyPass /helloworld https://nodo1:8443/helloworld
ProxyPass /ClusterWebApp https://nodo1:8443/ClusterWebApp

3-Hacer un reload de apache.

Si usamos el módulo mod_proxy_balancer no es necesario configurar el valor jvmRoute (en los servidores de JBoss), como en el caso de usar AJP (que es más optimo por ser una comunicación binaria)

Algunas chuletas para explorar manipular los certificados instalados en el keystore:
1-Listar certificados:

Source   
keytool -list -keystore ${jboss.domain.config.dir}/keystore.jks

2-Borrado de certificados (se identifican por el alias):

Source   
keytool -delete -alias cert_webserver -keystore ${jboss.domain.config.dir}/keystore.jks

Deja un comentario