Configuring JBoss 4 with HTTPS and SSL (In Spanish)
aglavina Mar 30, 2006 3:19 PMJMS Seguro utilizando JBoss 4.x
Este documento es una guía básica para establecer comunicaciones de JMS, utilizando SSL o HTTPS, con el servidor JBoss 4.2.x.
Introducción
Para empezar, una introducción básica a lo que es el SSL y el HTTPS.
El protocolo TCP es un protocolo orientado a conexión, que maneja datos en el nivel de transporte del modelo OSI, pero no maneja nada de las capas superiores, tampoco temas de seguridad. Por lo tanto, cualquier persona que tenga acceso al medio de transmisión puede ponerse a ?escuchar? las información que pasa y obtener datos valiosos, filtrar información para que no llegue a destino e incluso, hacerse pasar por alguno de los emisores e infiltrar información falsa.
Por este motivo, se crea el protocolo de seguridad SSL (o Secure Sockets Layer) que permite conectarse de forma segura entre dos extremos de la red, mediante técnicas de encriptación y criptografía.
El HTTPS, es un subconjunto del SSL, que funciona utilizando el protocolo HTTP, pero en vez de utilizar conexiones tradicionales de TCP, utiliza conexiones de SSL como base, permaneciendo de forma segura.
Para poder hacer funcionar el SSL, se utilizan certificados que permiten asegurar la identidad de una persona y un nodo en la red. Estos son certificados por las entidades certificadoras quienes validan los datos del solicitante, y adjuntan su certificado para probar la veracidad.
El certificado tiene dos claves: una privada (que solo conoce el propietario del certificado) y una pública (que conocen todos los usuarios, está encriptada y se arma en base a la privada, con 128, 512, o 1024 bits de datos).
Con todo esto, se arma el SSL.
Obtención de un Certificado
Paso 1: Generación del certificado
El certificado lo vamos a armar con un programa que viene con el SDK de Sun llamado keytool. Para ver la lista de comandos tipear keytool ?help.
Para generar un certificado se escribe lo siguiente:
keytool -genkey -alias alias_del_certificado
donde alias es un nombre distintivo para reconocer el certificado en el almacén de certificados o keystore. Si no se agrega nada, se generará en el almacén correspondiente al archivo user.home/.keystore. Para cambiar este archivo se puede poner el flag ?keystore nombre_del_archivo_keystore.
Luego se pide una clave del keystore (si no existe se creará al ingresarla) para poder realizar cualquier operación. Hecho esto aparecerán una serie de preguntas
¿Cuáles son su nombre y su apellido?
Aquí deberá ingresar el nombre del host. Por ejemplo, ?localhost.localdomain? esto deberá corresponder con el nombre de su máquina (que en linux podrá obtener mediante el comando hostname). En caso de ser un server de internet podrá ser por ejemplo ?server.mydomain.com?.
¿Cuál es el nombre de su unidad de organización? Ingrese lo correspondiente.
¿Cuál es el nombre de su organización? Ingrese lo correspondiente.
¿Cuál es el nombre de su ciudad o localidad? Ingrese lo correspondiente.
¿Cuál es el nombre de su estado o provincia? Ingrese lo correspondiente.
¿Cuál es el código de país de dos letras de la unidad?
Aquí deberá ingresar el código de dos letras correspondiente a su país como por ejemplo US para estados unidos.
Finalmente, se le preguntará por la confirmación de los datos
¿Es correcto CN=xxxx, OU=xxx, O=xxx, L=xxx, ST=xx, C=xx?
Y al confirmar se le pedirá el que ingrese la clave privada del certificado, terminando la generación.
Paso 2: Firma del certificado
En este ejemplo realizaremos nosotros mismos la firma de certificado para poder utilizarlo en nuestro servidor. Para hacerlo se deberá tipear en el prompt:
keytool -selfcert -alias alias_del_certificado -validity 365 -keysize 1024
Esto genera un certificado para el alias ingresado con una validez de 365 días y con un tamaño de 1024 bits.
Se le pedirá que ingrese la clave del almacén y luego el certificado quedará firmado por usted mismo.
Configuración del JBoss para Seguridad SSL / HTTPS
Tomaremos como referencia el directorio serverdir que apunta al directorio de instalación del servidor/server/su_server_que este_usando, típicamente ?all? o ?default?.
Paso 1: Habilitar el SSL en el JBoss
Entonces, copiaremos el archivo del keystore donde generamos el certificado a serverdir/conf con algún nombre, por ejemplo local.keystore.
Luego editamos el archivo serverdir/deploy/jbossweb-tomcat41.sar/META-INF/jboss-service.xml
Allí quedaría de la siguiente manera
<?xml version="1.0" encoding="UTF-8"?>
<!-- The service configuration for the embedded Tomcat4.1.x web container
-->
local.keystore
apache
(continúa el archivo ...)
<!-- A AJP 1.3 Connector on port 8009 -->
<!-- SSL/TLS Connector configuration using the SSL domain keystore -->
<Factory className = "org.apache.coyote.tomcat4.CoyoteServerSocketFactory"
keystoreFile="${jboss.server.home.dir}/conf/local.keystore"
keystorePass="test123?
protocol = "TLS"/>
<!-- -->
jboss:service=TransactionManager
Nota: El SSL con esta configuración está en el puerto 443, con lo cual hay que iniciar el servidor como root. Se pueden modificar los parámetros para que se inicie por ejemplo en el puerto 8443
Paso 2.1: Configurar JBoss para utilizar JMS con HTTPS
Ahora editamos el archivo serverdir/deploy/jms/jbossmq-httpil.sar/META-INF/jboss-service.xml quedando de la siguiente manera (se reemplaza localhost.localdomain por el nombre de Server que se ingresó en el certificado):
<?xml version="1.0" encoding="UTF-8"?>
<depends optional-attribute-name="Invoker">jboss.mq:service=Invoker
jboss.web:service=WebServer
HTTPConnectionFactory
HTTPXAConnectionFactory
0
60
0
https://localhost.localdomain/jbossmq-httpil/HTTPServerILServlet
Finalmente, en el código en vez de pedir un OIL2 o UIL2ConnectionFactory, pedir un HTTPConnectionFactory. Eso es todo. Para poder ver en el programa que es lo que ocurre con el SSL, se deberán ejecutar los programas con el siguiente parámetro ?-Djavax.net.debug=all?.
Paso 2.2: Configurar el JBoss para usar JMS con SSL
Ahora creamos el archivo serverdir/deploy/jms/ssluil2-service.xml con el siguiente contenido:
<depends optional-attribute-name="Invoker">jboss.mq:service=Invoker
SSLSUIL2ConnectionFactory
SSLSUIL2XAConnectionFactory
${jboss.bind.address}
8193
60000
true
<!-- Used to disconnect the client if there is no activity -->
<!-- Ensure this is greater than the ping period -->
70000
<!-- The size of the buffer (in bytes) wrapping the socket -->
<!-- The buffer is flushed after each request -->
2048
<!-- Large messages may block the ping/pong -->
<!-- A pong is simulated after each chunk (in bytes) for both reading and writing -->
<!-- It must be larger than the buffer size -->
1000000
org.jboss.security.ssl.ClientSocketFactory
org.jboss.security.ssl.DomainServerSocketFactory
java:/jaas/local
Finalmente, en el código en vez de pedir un OIL2 o UIL2ConnectionFactory, pedir un SSLUIL2ConnectionFactory. Eso es todo. Para poder ver en el programa que es lo que ocurre con el SSL, se deberán ejecutar los programas con el siguiente parámetro ?-Djavax.net.debug=all?.
Paso 2.3: Agregar al jboss-service.xml del httpHaInvoker el siguiente atributo:
https://localhost.localdomain/invoker/InvokerServlet
TESTING:
Trate de ingresar a:
https://localhost.localdomain/invoker/InvokerServlet
si responde correctamente, la configuracion es un exito