0 Replies Latest reply on Mar 30, 2006 3:19 PM by Andres Glavina

    Configuring JBoss 4 with HTTPS and SSL (In Spanish)

    Andres Glavina Newbie

      JMS 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