A cada uno le pica la paja que se le mete por el culo, no el resto del pajar.
Gonzo, El Sentido De La Vida

[Struts] – Comunicaciones seguras: SSL

Es posible que nuestra aplicación web requiera comunicaciones seguras. Para ello se utiliza https como protocolo de transporte en lugar del conocido http; es decir se cifran las comunicaciones a nivel de la capa de transporte mediante Secure Sockets Layer (SSL).

Como es lógico, cifrar las comunicaciones requiere más recursos (tiempo de cifrar / descifrar, mensajes más pesados…), y normalmente las aplicaciones no necesitan comunicaciones seguras más que en algunas acciones. Por tanto construir toda la aplicación bajo https no es tan eficiente como delimitar zonas no seguras (transporte http) y zonas seguras (transporte htpps) dentro de la misma aplicación.

Para ello utilizaremos un plug-in de código abierto, la extensión de Struts SSL Extension (SSLEXT).

  • La distribución, sslext.jar y sslext.tld, consiste en un clase para la inicialización, SecurePlugIn, una clase para el procesado de peticiones, SecureRequestProcessor, y una clase para los mapeos de actions, SecureActionMapping.
  • Necesita Java Secure Socket Extension (JSSE) que se distribuye con el JDK 1.4 o posteriores.
  • Lógicamente es necesario que el servidor de aplicaciones que estemos utilizando tenga habilitado SSL.

Paso a Paso

Para utilizar la extensión por tanto, debemos

  • incluir sslext.jar y sslext.tld en nuestra aplicación
  • [struts-config.xml] – Personalizar los mapeos de las clases actio

<action-mappings type="org.apache.struts.config.SecureActionConfig">

  • [struts-config.xml] – Personalizar el procesador de peticiones

<controller processorClass="org.apache.struts.action.SecureRequestProcessor" />

  • [struts-config.xml] – Declarar el plug-in

<plug-in className="org.apache.struts.action.SecurePlugIn">

    <set-property property="httpPort" value="80"/>

    <set-property property="httpsPort" value="443"/>     

    <set-property property="enable" value="true"/>     

    <set-property property="addSession" value="true"/>     

</plug-in>

  • [struts-config.xml] – Marcar las acciones seguras mediante la propiedad secure a TRUE

<action path="/inicio*" type="es.mec.accionesintegradas.control.actions.InicioAction" parameter="inicio{1}" >

    <!– Obligamos a esta acción a utilizar https : segura –>

    <set-property property="secure" value="true"/>

    <forward name="success" path="/iniciaLogin{1}.mec" />

</action>

  • [struts-config.xml] – Marcamos las acciones no seguras mediante la propiedad secure a FALSE

<action path="/salir*" type="es.mec.accionesintegradas.control.actions.LogoutAction" parameter="logout{1}">

      <!– Obligamos a esta acción a utilizar http : NO segura –>

      <set-property property="secure" value="false"/>

      <forward name="success" path="/iniciaLogin{1}.mec" />

</action>

  • Si queremos especificar que una página JSP sea segura (o no segura) :

<%@ taglib uri="http://www.ebuilt.com/taglib" prefix="sslext"%>

<sslext:pageScheme secure="true"/>

Crítico : Cambio http <-> https

Realizar un cambio de http a https y viceversa implica cambiar el protocolo de transporte y el puerto de comunicación (8080 a 8443 ó 443). Puede influir en los CortaFuegos de los sistemas de comunicaciones de la empresa (hay que habilitar esos puertos también!). Internamente es importante saber que internamente este cambio de protocolo implica realizar un redirect.

Finalmente cambiar de una comunicación segura a no segura puede exponer datos críticos seguros a un usuario malicioso que suplante la personalidad del usuario legítimo. Normalmente una vez que se establece una conexión segura no se debe voler a una no segura.

Más información

[tags]J2EE, Struts, SSL, SSLExt, seguridad[/tags]

También te puede interesar:

  • [Struts] – no Cache Si queremos que ninguna página de nuestra aplicación basada en Struts almacene los datos introducidos por el usuario en ellas (lo que se entiende por...
  • [Struts] – Control de Acceso El problema del control de acceso dentro de una aplicación web es habitual en las aplicaciones web. Es muy habitual comprobar que existe un objeto...
  • [Struts] – ActionDispatcher Struts permite manejar eventos HTML, mediante la clase ActionDispatcher, LookupDispachAciton y MappingDispatchAction que encontramos en el paquete org.apache.struts.actions. En la clase Action declaramos un ActionDipatcher...
  • Framework Struts Un esquema de su funcionamiento podría ser el siguiente: JSP Manda datos introducidos por el usuario al Action Pinta los datos recibidos del Action FORM...
  • Implementación con Struts : Control de acceso a una aplicación web Requisitos Necesitamos implantar un control de acceso de usuarios lo más genérico y simple posible a una aplicación web desplegada sobre Tomcat. Para ello tendremos...

3 Comentarios hasta el momento »

  1. Lycka Bonita » [Struts] - Extendiendo el Framework dijo

    8 de March del 2008 a las 1:33 pm

    [...] después añadir piezas para completar el puzzle, como Struts Validator, Tiles, Log4J, SSLExt… Y a su vez le permitirá sobrevivir como una pieza dentro de otros frameworks [...]

  2. Miguel dijo

    29 de January del 2012 a las 6:33 pm

    Muy buenas, muy bueno el tutorial pero yo sigo sin poder ver el https cuando envío la información de los formularios. He leido todo tipo de tutoriales para averiguar si había algo que estaba haciendo mal. He instalado el Tomcat v7, he obtenido el certificado con el .keystore, he modificado el struts-config.xml, el web.xml y el server.xml del Tomcat / Aplicación respectivamente.

    Ya no sé que puede ser pero cuando ejecuto la aplicación aparece en el puerto 8080, y tras enviar los datos del formulario tb aparece en la url el puerto 8080.

    Si cambio el puerto al 8443, va todo igual, todo pasa por el puerto 8443 pero no aparece las letras de https://

    Estoy haciendo algo que no debo hacer?¿ no he hecho algo que debo hacer?¿

    Gracias por la contestación ;)

    Miguel

  3. yoyoooyoy dijo

    30 de January del 2012 a las 9:42 am

    Hola Miguel,

    pufff, ha llovido desde que sabía de esto, pero a priori si estás utilizando el puerto 8443 debería estar siendo cifrada la comunicación.

    Comprueba con un sniffer si la información va cifrada en las JSPs y/o Actions que tienes marcadas como cifradas!

    Siento no poder ser más esclarecedor.

Comentarios RSS · TrackBack URI

Dejanos tu Comentario

Nombre: (Requerido)

E-Mail: (Requerido)

Sitio WEB:

Comentario:

Comenta