Documente Academic
Documente Profesional
Documente Cultură
MANUAL DE USUARIO
Servicios Web
Versión 2.1
Arquitectura de Software
Framework Atlas
Manual usuario de Servicios Web
Hoja de Control
Registro de Cambios
2 de 106
Framework Atlas
Manual usuario de Servicios Web
Índice
1. INTRODUCCIÓN ................................................................................................................................................................ 5
1.1. AUDIENCIA OBJETIVO ...................................................................................................................................................... 5
1.2. CONOCIMIENTOS PREVIOS ............................................................................................................................................... 5
2. DESCRIPCIÓN .................................................................................................................................................................... 6
3. ¿QUE SEGURIDAD DEBO IMPLEMENTAR? ............................................................................................................... 9
3.1.1. Seguridad de lado del Servidor ............................................................................................................................... 9
3.1.2. Seguridad de lado del Cliente ............................................................................................................................... 10
4. DESARROLLO DE UN SERVICIO WEB (SERVIDOR) .............................................................................................. 12
4.1. CREACIÓN DE UN SERVIDOR SIN SEGURIDAD (HTTP Y HTTPS SIN CERTIFICADO CLIENTE) ................. 13
4.1.1. Paso 1: Creación del módulo partiendo del Arquetipo de servicio web ............................................................... 13
4.1.2. Paso 2: Creación de la Interfaz del Servicio y clases para los parámetros ......................................................... 13
4.1.3. Paso 3: Implementación del Servicio ................................................................................................................... 15
4.1.4. Paso 4: Configuración del Servicio ...................................................................................................................... 16
4.1.5. Paso 5: Cambio del namespace del servicio (si se necesita) ................................................................................ 17
4.1.6. Paso 6: Eliminar Namespaces, Elements y Atributos (Si se necesita) .................................................................. 18
4.1.7. Paso 7: Levantar el Servidor ................................................................................................................................ 19
4.1.8. Paso 8: Obtener el wsdl del Servicio .................................................................................................................... 19
4.1.9. Paso 9: Creación de la interfaz para clientes en nuestro servidor ....................................................................... 21
4.1.10. Paso 10: Test Unitarios de nuestra libreria Cliente ............................................................................................. 23
4.2. CREACIÓN DE UN SERVIDOR CON VALIDACIÓN DE CERTIFICADO DE CLIENTE ..................................... 26
4.2.1. Paso 1: Alta de la aplicación en la plataforma ASF ............................................................................................. 26
4.2.2. Paso 2: Configuración del Servicio ...................................................................................................................... 27
4.2.3. Paso 3: Actualización de configuración en el fichero services.xml ...................................................................... 28
4.2.4. Paso 4: Modificación de la interfaz para clientes en nuestro servidor................................................................. 28
4.2.5. Acceso al certificado de cliente (para comprobaciones personalizadas) ............................................................. 29
4.3. CREACIÓN DE UN SERVIDOR CON SEGURIDAD EN MENSAJE – WS-SECURITY ......................................... 30
4.3.1. Paso 1: Alta de la aplicación en la plataforma ASF ............................................................................................. 31
4.3.2. Paso 2: Configuración del Servicio ...................................................................................................................... 32
4.3.3. Paso 3: Actualización de configuración en el fichero services.xml ...................................................................... 33
4.3.4. Paso 4: Modificación de la interfaz para clientes en nuestro servidor................................................................. 38
4.4. CREACIÓN DE UN SERVIDOR CON WS-SECURITY + CERTIFICADO DE CLIENTE ..................................... 39
4.4.1. Paso 1: Actualización de configuración en el fichero services.xml ...................................................................... 40
4.4.2. Paso 2: Modificación de la interfaz para clientes en nuestro servidor................................................................. 40
5. DESARROLLO DE UN SERVICIO WEB (CLIENTE) ................................................................................................. 42
5.1. ATLAS - CREACION DE UN CLIENTE (HTTP Y HTTPS SIN CERTIFICADO CLIENTE) ................................... 42
5.1.1. Paso 1: Inclusión de la dependencia .................................................................................................................... 42
5.1.2. Paso 2: Configuración del contexto de Spring ..................................................................................................... 42
5.1.3. Paso 3: Configuración del endpoint en environment.properties .......................................................................... 43
5.2. ATLAS - CREACION DE UN CLIENTE CON VALIDACIÓN DE CERTIFICADO DE CLIENTE ......................... 44
5.2.1. Paso 1: Añadir variables de environment ............................................................................................................. 44
5.2.2. Paso 2: Configuración de Spring .......................................................................................................................... 45
5.3. ATLAS - CREACION DE UN CLIENTE CON SEGURIDAD EN MENSAJE WS-SECURITY ............................... 47
5.3.1. Paso 1: Añadir variables de environment ............................................................................................................. 47
5.3.2. Paso 2: Configuración de Spring .......................................................................................................................... 48
5.4. ATLAS - CREACION DE UN CLIENTE CON WS-SECURITY + CERTIFICADO DE CLIENTE .......................... 50
5.4.1. Paso 1: Añadir variables de environment ............................................................................................................. 50
5.4.2. Paso 2: Configuración de Spring .......................................................................................................................... 52
5.5. WS EXTERNOS (NO ATLAS) - CREACIÓN DE UN CLIENTE (HTTP Y HTTPS).................................................. 55
5.5.1. Paso 1: Incluir fichero wsdl en el proyecto .......................................................................................................... 55
5.5.2. Paso 2: Inclusión de la dependencia y configuración del plugin.......................................................................... 55
5.5.3. Paso 3: Generación de la clases del Cliente ......................................................................................................... 58
3 de 106
Framework Atlas
Manual usuario de Servicios Web
4 de 106
Framework Atlas
Manual usuario de Servicios Web
1. INTRODUCCIÓN
En algunas ocasiones es necesario que las aplicaciones ofrezcan determinados Servicios Web tanto a otras
aplicaciones de la Comunidad de Madrid como a agentes externos. Por otra parte muchas de las aplicaciones que
se desarrollan para la Comunidad de Madrid necesitan acceder a Servicios Web (tanto servicios que se han
desarrollado específicamente para la tramitación electrónica como otros servicios web que incluso pueden estar
fuera de los entornos de ICM).
En este manual se describe cómo crear servicios web con el framework ATLAS, así como invocar a servicios web
existentes (creados con ATLAS o no). El manual incluye documentación sobre la creación/invocación de servicios
web con seguridad o sin ella.
Para aislar la complejidad de la amplia variedad de tipos de servicios web que nos podemos encontrar y los
distintos tipos de seguridad que nos pueden requerir los citados servicios web se ha desarrollado el componente
Invocador de Servicios de Atlas. Este componente facilita la creación de los clientes de acceso a los servicios
securizados, a través de una sencilla configuración que pueda incluir los requisitos de seguridad requeridos.
Este documento está orientado a desarrolladores java que quieran invocar a un servicio web desde un aplicativo
que se desarrolla con Atlas o que quieren generar un servicio web.
Para un completo entendimiento del documento, el lector deberá tener conocimientos previos sobre las siguientes
tecnologías:
- Spring Framework.
- Servicios Web
- Axis2 y Rampart
- Seguridad (uso básico de certificados)
5 de 106
Framework Atlas
Manual usuario de Servicios Web
2. DESCRIPCIÓN
Para la creación de nuevos servicios web se partirá de un arquetipo específico para servicios web. Los
servicios web desarrollados implementaran además del propio servicio web una librería cliente para dicho servicio
que facilitará la integración de este servicio web en otros proyectos Atlas. Para implementar un servicio web es
necesario:
Definir la interfaz del Servicio (Como una clase Java)
Implementar en el servicio web dicha interfaz
Implementar un cliente del servicio web
6 de 106
Framework Atlas
Manual usuario de Servicios Web
Acceso público
Servicio de acceso libre. No se realiza ningún tipo de control sobre el cliente. El canal de comunicación no está
cifrado.
Cliente WS Servidor WS
HTTP
Cliente WS Servidor WS
HTTPS
7 de 106
Framework Atlas
Manual usuario de Servicios Web
Cliente WS Servidor WS
HTTPS
Dentro del framework Atlas se soportan todos estos tipos de accesos y en este documento se describirán como
implementarlos tanto en la parte cliente como en la servidora. Cualquier otro tipo de acceso o de seguridad que se
requiera implementar que sea distinto de los anteriores ha de ser autorizado previamente por el área de
arquitectura de ICM.
8 de 106
Framework Atlas
Manual usuario de Servicios Web
Antes de la creación de un servicio web, es importante tener claro la seguridad que debemos implementar, en caso
de tener que hacerlo.
HTTP + Mensajes sin seguridad: El servicio estará disponible vía http y los mensajes que viajan no van ni
cifrados ni firmados.
Para este caso, seguiremos el manual en el punto 4.1:
CREACIÓN DE UN SERVIDOR SIN SEGURIDAD (HTTP y HTTPS SIN CERTIFICADO CLIENTE)
HTTPS + Mensajes sin seguridad: El servicio estará disponible vía https sin ningún otro requerimiento
para nuestros clientes y los mensajes que viajan no van ni cifrados ni firmados.
Para este caso, seguiremos el manual en el punto 4.1:
CREACIÓN DE UN SERVIDOR SIN SEGURIDAD (HTTP y HTTPS SIN CERTIFICADO CLIENTE)
HTTPS con certificado + Mensajes sin seguridad: El servicio estará disponible vía https y, como
servidores, exigiremos que el certificado de los clientes que se conectan sea válido (y otras validaciones
opcionales) y los mensajes que viajan no van ni cifrados ni firmados.
Para este caso, seguiremos el manual en el punto 4.2:
CREACIÓN DE UN SERVIDOR CON VALIDACIÓN DE CERTIFICADO DE CLIENTE
HTTP + Mensajes con seguridad: El servicio estará disponible vía http y los mensajes viajan cifrados,
firmados o ambas.
Para este caso, seguiremos el manual en el punto 4.3:
CREACIÓN DE UN SERVIDOR CON SEGURIDAD EN MENSAJE – WS-SECURITY
HTTPS + Mensajes con seguridad: El servicio estará disponible vía https y los mensajes viajan cifrados,
firmados o ambas.
Para este caso, seguiremos el manual en el punto 4.3:
CREACIÓN DE UN SERVIDOR CON SEGURIDAD EN MENSAJE – WS-SECURITY
HTTPS con certificado + Mensajes con seguridad: El servicio estará disponible vía https y, como
servidores, exigiremos que el certificado de los clientes que se conectan sea válido (y otras validaciones
opcionales) y los mensajes viajan cifrados, firmados o ambas.
Para este caso, seguiremos el manual en el punto 4.4:
CREACIÓN DE UN SERVIDOR CON WS-SECURITY + CERTIFICADO DE CLIENTE
9 de 106
Framework Atlas
Manual usuario de Servicios Web
Si debemos crear un cliente para consumir un servicio, tendremos que diferenciar entre clientes Atlas y clientes No
Atlas (Servicios web Externos).
WS Atlas - HTTP + Mensajes sin seguridad: Al servicio al que nos conectamos se accede a través de
HTTP y los mensajes que viajan no van ni cifrados ni firmados.
Para este caso, seguiremos el manual en el punto 5.1:
ATLAS - CREACION DE UN CLIENTE (HTTP y HTTPS SIN CERTIFICADO CLIENTE)
WS Atlas - HTTPS + Mensajes sin seguridad: Al servicio al que nos conectamos se accede a través de
HTTPS, como clientes no nos requieren certificado al conectar y los mensajes que viajan no van ni cifrados
ni firmados.
Para este caso, seguiremos el manual en el punto 5.1:
ATLAS - CREACION DE UN CLIENTE (HTTP y HTTPS SIN CERTIFICADO CLIENTE)
WS Atlas – HTTPS con certificado + Mensajes sin seguridad: Al servicio al que nos conectamos se
accede a través de HTTPS y el servidor requiere que, como clientes, nos identifiquemos con un certificado.
Los mensajes que viajan no van ni cifrados ni firmados.
Para este caso, seguiremos el manual en el punto 5.2:
ATLAS - CREACION DE UN CLIENTE CON VALIDACIÓN DE CERTIFICADO DE CLIENTE
WS Atlas – HTTP + Mensajes con seguridad: Al servicio al que nos conectamos se accede a través de
HTTP y los mensajes que viajan van cifrados, firmados o ambas.
Para este caso, seguiremos el manual en el punto 5.3:
ATLAS - CREACION DE UN CLIENTE CON SEGURIDAD EN MENSAJE WS-SECURITY
WS Atlas – HTTPS + Mensajes con seguridad: Al servicio al que nos conectamos se accede a través de
HTTPS, como clientes no nos requieren certificado al conectar y los mensajes que viajan van cifrados,
firmados o ambas.
Para este caso, seguiremos el manual en el punto 5.3:
ATLAS - CREACION DE UN CLIENTE CON SEGURIDAD EN MENSAJE WS-SECURITY
WS Atlas – HTTPS con certificado + Mensajes con seguridad: Al servicio al que nos conectamos se
accede a través de HTTPS y el servidor requiere que, como clientes, nos identifiquemos con un certificado.
Los mensajes que viajan van cifrados, firmados o ambas.
Para este caso, seguiremos el manual en el punto 5.4:
ATLAS - CREACION DE UN CLIENTE CON WS-SECURITY + CERTIFICADO DE CLIENTE
10 de 106
Framework Atlas
Manual usuario de Servicios Web
WS Externo – HTTP + Mensajes sin seguridad: Al servicio al que nos conectamos se accede a través de
HTTP y los mensajes que viajan no van ni cifrados ni firmados.
Para este caso, seguiremos el manual en el punto 5.5:
WS EXTERNOS (NO ATLAS) - CREACIÓN DE UN CLIENTE (HTTP y HTTPS)
WS Externo – HTTPS + Mensajes sin seguridad: Al servicio al que nos conectamos se accede a través
de HTTPS, como clientes no nos requieren certificado al conectar y los mensajes que viajan no van ni
cifrados ni firmados.
Para este caso, seguiremos el manual en el punto 5.5:
WS EXTERNOS (NO ATLAS) - CREACIÓN DE UN CLIENTE (HTTP y HTTPS)
WS Externo – HTTPS con certificado + Mensajes sin seguridad: Al servicio al que nos conectamos se
accede a través de HTTPS y el servidor requiere que, como clientes, nos identifiquemos con un certificado.
Los mensajes que viajan no van ni cifrados ni firmados.
Para este caso, seguiremos el manual en el punto 5.6:
WS EXTERNOS (NO ATLAS) - CREACIÓN DE UN CLIENTE CON CERTIFICADO DE CLIENTE
WS Externo – HTTP + Mensajes con seguridad: Al servicio al que nos conectamos se accede a través
de HTTP y los mensajes que viajan van cifrados, firmados o ambas.
Para este caso, seguiremos el manual en el punto 5.7:
WS EXTERNOS (NO ATLAS) - CREACIÓN DE UN CLIENTE CON SEGURIDAD WS-SECURITY
WS Externo – HTTPS + Mensajes con seguridad: Al servicio al que nos conectamos se accede a través
de HTTPS, como clientes no nos requieren certificado al conectar y los mensajes que viajan van cifrados,
firmados o ambas.
Para este caso, seguiremos el manual en el punto 5.7:
WS EXTERNOS (NO ATLAS) - CREACIÓN DE UN CLIENTE CON SEGURIDAD WS-SECURITY
WS Externo – HTTPS con certificado + Mensajes con seguridad: Al servicio al que nos conectamos se
accede a través de HTTPS y el servidor requiere que, como clientes, nos identifiquemos con un certificado.
Los mensajes que viajan van cifrados, firmados o ambas.
Para este caso, seguiremos el manual en el punto 5.8:
WS EXTERNOS (NO ATLAS) - CREACIÓN DE UN CLIENTE CON SEGURIDAD WS-SECURITY + CERTIFICADO
DE CLIENTE
11 de 106
Framework Atlas
Manual usuario de Servicios Web
En este apartado se muestra cómo crear un servicio web con el framework ATLAS, así como el procedimiento para
aportar seguridad al servicio web (integrándose con la plataforma ASF).
12 de 106
Framework Atlas
Manual usuario de Servicios Web
4.1. CREACIÓN DE UN SERVIDOR SIN SEGURIDAD (HTTP y HTTPS SIN CERTIFICADO CLIENTE)
En los siguientes sub-apartados se muestra cómo crear un proyecto servicio web con el framework Atlas, sin
ningún tipo de seguridad a nivel de mensaje (ws-security) ni comprobaciones de certificados de cliente. Esta
configuración acepta tanto http como https siempre y cuando no exista validación de certificado de cliente (se
aceptan todos los clientes que se conecten).
4.1.1. Paso 1: Creación del módulo partiendo del Arquetipo de servicio web
El framework ATLAS tiene disponible un arquetipo preconfigurado y preparado para la creación de proyectos de
servicios web. El uso de este arquetipo genera una primera versión de proyecto con clases demostrativas del uso y
funcionalidad.
ATENCION
La creación de servicios web debe ser realizada siempre en base al arquetipo ’atlasfrm-
arquetipos-generador-servicioweb’, según se explica en el manual
“ATLAS_MUS_Arquetipo_WebService”
El arquetipo de servicio web de ATLAS generará un proyecto modular, que contiene tres módulos:
- web: El servicio web expuesto.
- test: tests de SoapUI para el servicio web.
- lib: Librería (jar) que contiene las clases que definen el interfaz del servicio web a exponer, así como
los objetos de dominio. Se han separado estas clases en una librería aparte porque esta librería podrá
ser utilizada en otros proyectos para invocar al servicio web.
ATENCION
Las clases de servicio que se van a crear son las mismas que las que se definen en la capa de
servicios de la normativa de Atlas, por lo tanto les aplica la misma normativa.
4.1.2. Paso 2: Creación de la Interfaz del Servicio y clases para los parámetros
La interfaz del servicio debe ser creada dentro del módulo lib, de esta forma es compartido por el servicio web y
por la aplicación cliente del servicio web. El módulo web contiene una dependencia del módulo lib de forma que
13 de 106
Framework Atlas
Manual usuario de Servicios Web
ATENCION
La creación de las clases que representan la interfaz del servicio web se realizará dentro del
módulo lib del proyecto.
Clase lib/src/main/java/xxxx/services/MiPrimerService.java
package prueba123.services;
import atlas.core.exceptions.ServiceException;
Tal y como indica la normativa de Atlas con respecto a los servicios todos los métodos deben lanzan
ServiceException cuando ocurre algún problema.
Si la interfaz del servicio incluye parámetros que no son tipo básicos hay que crear una clase para cada uno de los
parámetros.
En la interfaz EjemploServicio que se incluye de ejemplo en el arquetipo, se define un objeto de entrada llamado
DatosEntrada y un objeto de salida, llamado DatosSalida. Estos objetos de datos tienen que ser creados en el
módulo lib del cliente ya que serán usados tanto por el cliente y por el servicio web.
ATENCION
La creación de las clases que representan los objetos de entrada/salida del servicio web se
realizará dentro del módulo lib del proyecto. Además estos objetos no pueden ser objetos de
dominio de Hibernate sino simples POJOS y serializables.
14 de 106
Framework Atlas
Manual usuario de Servicios Web
Clase lib/src/main/java/xxxx/domain/DatosEntrada.java
Una vez creada la interfaz del servicio, debemos proceder a crear la clase que implementa dicha interfaz.
La implementación del servicio web tendrá las siguientes características:
Se creará en el módulo web del proyecto.
Residirá en el mismo paquete que la interfaz del servicio en el módulo de cliente.
Su nombre será el de la interfaz de servicio acabado en „Impl’ siguiendo la normativa de
creación de servicios de ATLAS.
Incluirá la anotación @Service
ATENCION
La creación de las clases que implementan el servicio web se realizará dentro del módulo web
del proyecto, y pertenecerán al mismo paquete que las interfaces que implementan.
15 de 106
Framework Atlas
Manual usuario de Servicios Web
Clase lib/src/main/java/xxxx/services/MiPrimerServiceImpl.java
package prueba123.services;
import org.springframework.stereotype.Service;
import atlas.core.exceptions.ServiceException;
@Service
public class MiPrimerServiceImpl implements MiPrimerService{
@Override
public String getFechaString() throws ServiceException {
return "fecha";
}
Para que el servicio web esté accesible será necesario realizar dos configuraciones:
Definir un bean en el contexto de Spring para la clase implementada del Servicio en el fichero
web/src/main/resources/conf/applicationContext-services.xml,
Fichero web/src/main/resources/conf/applicationContext-services.xml
[...]
</beans>
16 de 106
Framework Atlas
Manual usuario de Servicios Web
En el fichero service.xml están todas las definiciones de servicios web que necesita Axis2. Cada tag <service>
define un webservice diferente.
Fichero web/src/main/webapp/WEB-INF/services.xml
[...]
<service name="MiServicioWeb">
<parameter name="ServiceObjectSupplier" locked="false">
org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier
</parameter>
<parameter name="SpringBeanName" ocked="false">miPrimerService</parameter>
<parameter name="ServiceClass"
locked="false">prueba123.services.MiPrimerService
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
</messageReceivers>
</service>
[...]
Se ha de incluir un tag de service como el que se muestra de ejemplo modificando los siguientes parámetros:
Si se quiere modificar el namespace del servicio web generado por defecto se hace modificando las propiedades
xmlns:ns y targetNamespace y añadiendo el tag <schema schemaNamespace=""/>
Fichero web/src/main/webapp/WEB-INF/services.xml
[...]
<service name="MiServicioWeb"
xmlns:ns="http://salud.madrid.org/IntegracionHorus"
targetNamespace="http://salud.madrid.org/IntegracionHorus">
<schema schemaNamespace="http://salud.madrid.org/IntegracionHorus"/>
[...]
</service>
[...]
17 de 106
Framework Atlas
Manual usuario de Servicios Web
ATENCION
Para hacer los cambios propuestos en este punto se deberá pedir una autorización excepcional
a Arquitectura explicando la necesidad de usarlo, ya que un cambio en la respuesta XML de un
Web Service puede hacer que los clientes no puedan leerla correctamente
Si se quiere modificar cualquier parte del xml de respuesta que se envía como respuesta del servicio se deberá
hacer uso del patrón “message exchange pattern” (MEP) creando una clase que implemente la clase abstracta
AtlasInOutMessageReceiver y hacer un Override del método “modificarRespuesta”, esta clase se deberá indicar
en el Services.xml en a nivel de todo el servicio o solo a nivel de una operación, a continuación se ponen ambos
ejemplos:
Fichero web/src/main/webapp/WEB-INF/services.xml
[...]
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="ws128.services.MiInterceptor" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
</messageReceivers>
</service>
[...]
Fichero web/src/main/webapp/WEB-INF/services.xml
[...]
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
</messageReceivers>
<operation name="alterar">
<messageReceiver class="ws128.services.MiInterceptor"/>
</operation>
</service>
[...]
18 de 106
Framework Atlas
Manual usuario de Servicios Web
MiInterceptor.java
package ws128.services;
import atlas.clientews.client.AtlasInOutMessageReceiver;
@Override
public String modificarRespuesta(String respuesta) {
//Estos reemplazos son solo de ejemplo
respuesta = respuesta.replaceAll("<ns:", "<");
respuesta = respuesta.replaceAll("</ns:", "</");
respuesta = respuesta.replaceAll("xsi:type=\"ax23:DatosSalida\"", "");
return respuesta;
}
Una vez configurado el servicio web, para probarlo deberá ejecutarse el servidor Jetty según se explica en el
manual “ATLAS_MUS_Arquetipo_WebService”. Para comprobar que se ha levantado correctamente y que están
disponibles los servicios se puede acceder a la url http://localhost:9080 y nos debe aparecer una pantalla similar a
esta:
Para obtener el wsdl de nuestro servicio web se puede a través de una url del siguiente tipo:
http://localhost:9080/services/MiServicioWeb?wsdl
19 de 106
Framework Atlas
Manual usuario de Servicios Web
Este wsdl se ha de guardar en el módulo test en la carpeta test/src/main/resources/wsdl con el nombre del
servicio y la extensión wsdl. Ej: MiServicioWeb.wsdl.
En el caso de que el servicio web se construya a partir de un wsdl predeterminado (que no hay sido generada por
Axis) al intentar acceder al wsdl se obtiene el siguiente error:
<error>
<description>Unable to generate WSDL 1.1 for this service</description>
<reason>If you wish Axis2 to automatically generate the WSDL 1.1, then please set
useOriginalwsdl as false in your services.xml</reason>
</error>
<parameter name="useOriginalwsdl">true</parameter>
b.- Para que el fichero WSDL pueda ser localizado y entregado, este ha de dejarse, con el
nombre del servicio en el directorio WEB-INF.
---->WEB-INF/EjemploServicio.wsdl
20 de 106
Framework Atlas
Manual usuario de Servicios Web
http://localhost:9080/services/EjemploServicio?wsdl
---->WEB-INF
-------->services
------------>EjemploServicio
---------------->META-INF
-------------------->services.xml (descriptor del servicio)
-------------------->service.wsdl
-------------------->parte1.xsd
-------------------->parte2.xsd
http://localhost:9080/services/EjemploServicio?wsdl [^]
http://localhost:9080/services/EjemploServicio?xsd=parte1.xsd [^]
http://localhost:9080/services/EjemploServicio?xsd=parte2.xsd [^]
En el caso de tener un WSDL predeterminado para el servicio, además será necesario editar el fichero
weblogic.xml y añadir la siguiente línea (marcada en amarillo):
Fichero web/src/main/webapp/WEB-INF/weblogic.xml
<wls:container-descriptor>
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
<wls:show-archived-real-path-enabled>true</wls:show-archived-real-path-enabled>
</wls:container-descriptor>
Una vez creado el servicio web ahora vamos a crear el cliente que se distribuirá con una librería para que las
aplicaciones que tengan que integrarse con nuestra aplicación lo hagan utilizando esta librería.
Los clientes de servicio web ATLAS se caracterizan por que no se generan a partir de un descriptor WSDL del
servicio sino que se parte de la clase de la interfaz del servicio y de las clases que representen a los parámetros
21 de 106
Framework Atlas
Manual usuario de Servicios Web
del mismo. La invocación a los métodos del servicio web va a ser dinámica. Para facilitar esta invocación dinámica
dentro del framework Atlas existen dos clases base para la creación de clientes de servicio web, en el caso actual
hablamos de clientes no seguros y clientes seguros sin validación de certificado de cliente.
AtlasUnsecuredWSClient: esta clase es la utilizada para servidores sin seguridad a nivel de mensaje o
seguridad HTTPS sin validación de certificado de cliente (Todos los clientes pueden conectar) ;
ClienteMiPrimerService.java
package prueba.client;
import java.util.Properties;
import prueba.services.MiPrimerService;
import atlas.clientews.client.AtlasUnsecuredWSClient;
import atlas.core.exceptions.ServiceException;
/** Propiedades */
private Properties properties;
@Override
public String getFechaString() throws ServiceException {
return invoke("getFechaString", properties, String.class);
}
/**
* Establece el valor de las propiedades
* @param properties las propiedades
*/
public void setProperties(Properties properties) {
this.properties = properties;
}
}
22 de 106
Framework Atlas
Manual usuario de Servicios Web
7) Las llamadas al servicio web se realizan a través del método invoke con los parámetros definidos en su
javadoc:
En caso de que el método de llamada acepte más de un parámetro de entrada, se deberá realizar la llamada al
método invoke de la siguiente forma:
@Override
public DatosSalida alterar(DatosEntrada entrada1, String entrada2)
throws ServiceException {
1) Las propiedades del servicio se almacenan en una variable interna de la clase ya que es necesario
pasarlas en cada llamada a la clase base AtlasUnsecuredWSClient. Es necesario también que esté
implementado el método setProperties tal cuál viene en el ejemplo. En casos generales, no será necesario
especificar ningún parámetro en las propiedades del servicio, siempre que no se envíen ficheros adjuntos
(en caso afirmativo debe establecerse enableMTOM a „true’) y no se haga uso de otros módulos de Axis2
como por ejemplo „addressing‟. A continuación se muestran las propiedades que se pueden utilizar:
Los tests unitarios que habrán de realizarse dentro de la librería deben comprobar la correcta comunicación con el
23 de 106
Framework Atlas
Manual usuario de Servicios Web
webservice en cada uno de los métodos de llamada de que disponga. Para la creación de dichos tests se utilizará,
como es norma en el framework ATLAS, la librería java jUnit 4. Para facilitar la creación del contexto de Spring las
clases de test heredarán de la clase AbstractJUnit4SpringContextTests.
NOTA
Con el arquetipo recien generado todos los métodos de los test de JUnit incluyen la anotación @Ignore y no se
ejecutarán en el proceso de construcción de la librería cliente (serán ignorados). Una vez creada e instalada la
librería en el repositorio local (mvn clean install), se podrá eliminar la anotación @Ignore de cualquier método
que se desee testear, y ejecutar el test con el comando mvn test (el módulo de servidor web debe estar
arrancado también para que el test sea correcto).
lib/src/test/java/ClienteMiPrimerServiceTest.java
24 de 106
Framework Atlas
Manual usuario de Servicios Web
package prueba.client;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import prueba.services.MiPrimerService;
@ContextConfiguration(locations = {"classpath:/conf/applicationContext-test.xml"})
public class ClienteMiPrimerServiceTest extends AbstractJUnit4SpringContextTests {
@Test
public void testGetFechaString() {
assertNotNull("El servicio es nulo", service);
String salida = null;
try {
salida = service.getFechaString();
} catch (Exception e){
e.printStackTrace();
fail("Error en la llamada");
}
assertNotNull(salida);
System.out.println("** Salida: " + salida);
}
En este ejemplo, se ha creado un test unitario que recoge la instancia del invocador concreto de Spring. A través
de Spring también se está pasando una URL concreta de servicio para testear. Además de implementar el test,
para probar el cliente es necesario configurar el endpoint en el contexto de Spring de los tests, modificando el
fichero lib/src/test/resources//environment.properties, según se muestra en el ejemplo incluido en el arquetipo:
25 de 106
Framework Atlas
Manual usuario de Servicios Web
lib/src/test/resources/environment.properties
[...]
# Datos de WS
miPrimerService.endpoint=http://localhost:9080/services/MiServicioWeb
[...]
Este test se puede ejecutar desde el propio Eclipse como cualquier test unitario, pero hay que tener en cuenta que
hay que tener levantado el servicio web.
En los servicios web en los que haya que implementar seguridad a nivel de transporte HTTPS y sea necesario la
validación de los clientes que se conectan, es necesaria configurar nuestro servidor para que verifique el cliente
conectado contra la plataforma de ASF. Para ello hay que realizar los siguientes pasos.
ATENCION
Esta configuración es para conexiones seguras HTTPS en las que el servidor verifica los
clientes conectados contra ASF.
Si se precisa una conexión segura (HTTPS) sin este tipo de validaciones (permitiendo a todos
los clientes conectarse), consultar el apartado previo:
Antes de configurar la aplicación, debemos darla de alta en el entorno ASF y configurarla. Para el entorno de
desarrollo, esto se debe realizar mediante una consulta a la Unidad de Arquitectura de Aplicaciones en la categoría
de ASF a través de la web de soporte. Para el resto de entornos (validación, producción, etc.) se incluye dicha
información en la ficha de entrega.
26 de 106
Framework Atlas
Manual usuario de Servicios Web
- certificado de servidor a utilizar: Indicar qué certificado de servidor se desea utilizar, o si se quiere
utilizar uno genérico.
Como respuesta a la solicitud, la Unidad de Arquitectura de Aplicaciones contestará con un mensaje como este:
- SERVIDOR
> ID de aplicación ASF: EJPL_WS_SERVIDOR
> alias "localkey": servidor_ws
- CLIENTE
> ID de aplicación ASF: EJPL_WS_CLIENTE
> alias "localkey": cliente_ws
> alias "remotekey": servidor_ws_cert
En la respuesta se mostrarán los datos de configuración necesarios para el servicio web (apartado SERVIDOR) y
para las pruebas unitarias del cliente en el módulo lib (apartado CLIENTE).
Una vez que se ha dado de alta en ASF y con los de SERVIDOR tenemos que incluir en el fichero
src/main/resources/environment.properties lo siguiente:
src/main/resources/environment.properties
# Ids de aplicacion
app.id.asf=EJPL_WS_SERVIDOR
# Parametros de WS
El valor de la variable app.id.asf es el identificador de la aplicación en la plataforma ASF (debe ser igual que la
aplicación dada de alta en ASF). Este dato se corresponde con el ID de aplicación en el apartado SERVIDOR de la
27 de 106
Framework Atlas
Manual usuario de Servicios Web
En la lista de parámetros:
Fichero web/src/main/webapp/WEB-INF/services.xml
<service name="ComunicacionApertura">
...
<parameter name="asfInvokingApp">${app.id.asf}</parameter>
Donde dicha variable se corresponde con el código ASF de nuestra aplicación registrada en ASF.
Fichero web/src/main/webapp/WEB-INF/services.xml
…
<transports>
<transport>https</transport>
</transports>
Fichero web/src/main/webapp/WEB-INF/services.xml
Esta configuración en nuestro servidor, hará que los clientes que se conecten sean verificados contra ASF
Una vez creado el servicio web ahora vamos a crear el cliente que se distribuirá con una librería para que las
aplicaciones que tengan que integrarse con nuestra aplicación lo hagan utilizando esta librería.
Los clientes de servicio web ATLAS se caracterizan por que no se generan a partir de un descriptor WSDL del
28 de 106
Framework Atlas
Manual usuario de Servicios Web
servicio sino que se parte de la clase de la interfaz del servicio y de las clases que representen a los parámetros
del mismo. La invocación a los métodos del servicio web va a ser dinámica. Para facilitar esta invocación dinámica
dentro del framework Atlas existen varias clases base para la creación de clientes de servicio web, en el caso
actual hablamos de clientes seguros con validación de certificado.
AtlasHttpsWSClient: esta clase es la utilizada para servidores con seguridad a nivel de transporte HTTPS
y certificado de cliente
ClienteMiPrimerService.java
package prueba.client;
import java.util.Properties;
import prueba.services.MiPrimerService;
import atlas.clientews.client.AtlasHttpsWSClient;
import atlas.core.exceptions.ServiceException;
/** Propiedades */
private Properties properties;
@Override
public String getFechaString() throws ServiceException {
return invoke("getFechaString", properties, String.class);
}
/**
* Establece el valor de las propiedades
* @param properties las propiedades
*/
public void setProperties(Properties properties) {
this.properties = properties;
}
}
Hemos configurado un servicio web para que los clientes que conectan sean verificados contra ASF.. Sin embargo,
el servicio web puede tener otros requisitos de seguridad respecto del cliente, como saber si el certificado que
conecta, aun siendo aceptado por ASF, es válido para nuestro servicio.
29 de 106
Framework Atlas
Manual usuario de Servicios Web
Dentro del código del servicio web es sencillo recoger el certificado digital cliente de firma, tal y como se muestra a
continuación:
En el ejemplo anterior se ha marcado en amarillo la sentencia con la que se recoge el certificado de firma del
mensaje del cliente (el resto del código es solo un ejemplo de implementación). Hay que tener las siguientes
consideraciones:
Si el mensaje no contiene seguridad, se devolverá un valor null.
Si se produce algún problema en la exploración del mensaje entrante para la captura del certificado, se
devolverá una excepción AtlasSecurityException.
Si se desea obtener los datos de este certificado, será necesario realizar las llamadas correspondientes al
servicio de ASF de ATLAS (CryptService.getDatosCertificado(String)). Para más información, consultar
el documento ATLAS_MUS_Servicio_Certificados.doc.
En los servicios web en los que haya que implementar seguridad a nivel de mensaje, utilizaremos WS Security.
En este apartado se muestra cómo configurar un servicio web para incluir seguridad de WS-Security que consiste
en que la seguridad va dentro del mensaje SOAP.
Antes de implementar la seguridad en un servicio web lo primero es crear el servicio web y probar su correcto
30 de 106
Framework Atlas
Manual usuario de Servicios Web
funcionamiento sin incluir seguridad tal y como se indica en los apartados anteriores.
Para cada servicio web al que se quiera incluir seguridad, ha de asociale una política de seguridad. Dentro del
arquetipo en el módulo lib podemos encontrarnos dos politicas (lib/src/main/resources/META-INF):
politicaWSSFirmado.xml
politicaWSSFirmadoCifrado.xml
En estos ficheros se definen las restricciones de seguridad a aplicar siguiendo los estándares de WS Security-
Policy.
Para las operaciones de firma, cifrado y validación de firma y cifrado se utilizará la plataforma ASF.
Antes de configurar la aplicación, debemos darla de alta en el entorno ASF y configurarla. Para el entorno de
desarrollo, esto se debe realizar mediante una consulta a la Unidad de Arquitectura de Aplicaciones en la categoría
de ASF a través de la web de soporte. Para el resto de entornos (validación, producción, etc.) se incluye dicha
información en la ficha de entrega.
31 de 106
Framework Atlas
Manual usuario de Servicios Web
Como respuesta a la solicitud, la Unidad de Arquitectura de Aplicaciones contestará con un mensaje como este:
- SERVIDOR
> ID de aplicación ASF: EJPL_WS_SERVIDOR
> alias "localkey": servidor_ws
- CLIENTE
> ID de aplicación ASF: EJPL_WS_CLIENTE
> alias "localkey": cliente_ws
> alias "remotekey": servidor_ws_cert
En la respuesta se mostrarán los datos de configuración necesarios para el servicio web (apartado SERVIDOR) y
para las pruebas unitarias del cliente en el módulo lib (apartado CLIENTE).
Una vez que se ha dado de alta en ASF y con los de SERVIDOR tenemos que incluir en el fichero
src/main/resources/environment.properties lo siguiente:
src/main/resources/environment.properties
# Ids de aplicacion
app.id.asf=EJPL_WS_SERVIDOR
# Parametros de WS
miPrimerService.localKey=servidor_ws
El valor de la variable app.id.asf es el identificador de la aplicación en la plataforma ASF (debe ser igual que la
aplicación dada de alta en ASF). Este dato se corresponde con el ID de aplicación en el apartado SERVIDOR de la
respuesta de la Unidad de Arquitectura de Aplicaciones.
Es necesario crear una variable con la siguiente nomenclatura <nombreServicio>.localKey con el valor del alias
“localkey” proporcionado (alias del certificado con el que se va a firmar la respuesta). Ejpl:
miPrimerService.localkey.
32 de 106
Framework Atlas
Manual usuario de Servicios Web
ATENCION
Recordar que cada vez que se modifica el valor de una variable en el fichero
src/main/resources/environment.properties es necesario también modificar todos los ficheros
war/(nombreEntorno)/environment.properties.
Para asociar una política de seguridad para un servicio web determinado, hay que incluir una serie de líneas dentro
del tag <service> asociado al servicio en el fichero services.xml. En un fichero services.xml podrá haber servicios
seguros y servicios no seguros conviviendo sin problemas.
Como hemos dicho hay dos políticas por lo tanto dos configuraciones distintas a incluir dependiendo de cual se
elija:
33 de 106
Framework Atlas
Manual usuario de Servicios Web
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
</messageReceivers>
34 de 106
Framework Atlas
Manual usuario de Servicios Web
<sp:SignedParts
xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<sp:Body/>
</sp:SignedParts>
<atlas:ASFConfig xmlns:atlas="http://atlas.madrid.org/security/policy">
<atlas:invokingApp>${app.id.asf}</atlas:invokingApp>
<atlas:operationMode>server</atlas:operationMode>
<atlas:localKey>${miPrimerService.localKey}</atlas:localKey>
<sp:Wss10
xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:MustSupportRefKeyIdentifier/>
<sp:MustSupportRefIssuerSerial/>
</wsp:Policy>
</sp:Wss10>
<atlas:wsuTsLife>300000</atlas:wsuTsLife>
</atlas:ASFConfig>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
</service>
35 de 106
Framework Atlas
Manual usuario de Servicios Web
<service name="MiServicioWebWSSecurity1">
<parameter name="ServiceObjectSupplier" locked="false">
org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier
</parameter>
<parameter name="SpringBeanName" locked="false">miPrimerService</parameter>
<parameter name="ServiceClass" locked="false">
prueba123.services.MiPrimerService
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
</messageReceivers>
36 de 106
Framework Atlas
Manual usuario de Servicios Web
<sp:SignedParts
xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<sp:Body/>
</sp:SignedParts>
<sp:EncryptedParts
xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<sp:Body/>
</sp:EncryptedParts>
<atlas:ASFConfig xmlns:atlas="http://atlas.madrid.org/security/policy">
<atlas:invokingApp>${app.id.asf}</atlas:invokingApp>
<atlas:operationMode>server</atlas:operationMode>
<atlas:localKey>${miPrimerService.localKey}</atlas:localKey>
<sp:Wss10
xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:MustSupportRefKeyIdentifier/>
<sp:MustSupportRefIssuerSerial/>
</wsp:Policy>
</sp:Wss10>
<atlas:wsuTsLife>300000</atlas:wsuTsLife>
</atlas:ASFConfig>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
</service>
La variable incluida en amarillo es la única que hay que configurar. El resto es igual para todos los servicios que
necesiten esta politica de firma y cifrado. Se ha de poner el nombre de la variable incluida en el fichero
enviroment.properties.
Aunque en el listado anterior se han incluido las variables de configuración básicas, si se necesita una
configuración avanzada puede utilizarse cualquiera de las variables definidas en la siguiente tabla:
37 de 106
Framework Atlas
Manual usuario de Servicios Web
encryptionOperation Nombre de la operación en ASF para el cifrado del Por defecto: CIFRADO
mensaje. Parámetro no obligatorio. Será comunicado
en la respuesta a la solicitud en ASF si es necesario
configurarlo
applySecurityOnFault Por defecto se aplica la seguridad configurada a todos Por defecto: true
los mensajes del servicio. En algunos casos (red
SARA) es necesario no aplicar seguridad a los
mensajes que generan un <soap:fault>. Si se desea
este comportamiento se debe configurar un valor „false‟
en este parámetro
Una vez creado el servicio web ahora vamos a crear el cliente que se distribuirá con una librería para que las
aplicaciones que tengan que integrarse con nuestra aplicación lo hagan utilizando esta librería.
Los clientes de servicio web ATLAS se caracterizan por que no se generan a partir de un descriptor WSDL del
servicio sino que se parte de la clase de la interfaz del servicio y de las clases que representen a los parámetros
del mismo. La invocación a los métodos del servicio web va a ser dinámica. Para facilitar esta invocación dinámica
dentro del framework Atlas existen varias clases base para la creación de clientes de servicio web, en el caso
actual hablamos de clientes seguros con validación de certificado.
AtlasSecuredWSClient: esta clase es la utilizada para servidores con seguridad a nivel de mensaje a
través de WS-Security
ClienteMiPrimerService.java
38 de 106
Framework Atlas
Manual usuario de Servicios Web
package prueba123.client;
import java.util.Properties;
import prueba123.services.MiPrimerService;
import atlas.clientews.client.AtlasSecuredWSClient;
import atlas.core.exceptions.ServiceException;
/** Propiedades */
private Properties properties;
@Override
public String getFechaString() throws ServiceException {
/**
* Establece el valor de las propiedades
* @param properties las propiedades
*/
public void setProperties(Properties properties) {
this.properties = properties;
}
}
En caso de tener que realizar un servidor con seguridad a nivel de mensaje + seguridad a nivel de transporte
concertificado de cliente.
La configuración de este tipo de servicio web es la misma que la del punto anterior (Servidor con WS-Security) solo
que añadiremos también el módulo de seguridad.
ATENCION
Este apartado describe la configuración para un servidor con seguridad a nivel de mensaje y a
nivel de transporte con certificado de cliente.
En caso de la seguridad a nivel de transporte es a través de certificado de cliente, el servidor
verificará los clientes conectados.
Si no se va a comprobar los clientes conectados (si no se requiere esta validación) basta con
seguir los pasos del punto anterior:
CREACIÓN DE UN SERVIDOR CON SEGURIDAD EN MENSAJE – WS-SECURITY
39 de 106
Framework Atlas
Manual usuario de Servicios Web
Una vez seguidos los pasos del punto anterior, añadir al fichero services.xml las siguientes líneas, de tal manera
que el fichero services.xml quedaría así:
services.xml
[...]
<service name="EjemploServicioSeguroFirmadoHttps">
[...]
<parameter name="asfInvokingApp">${app.id.asf}</parameter>
<transports>
<transport>https</transport>
</transports>
[...]
Una vez creado el servicio web ahora vamos a crear el cliente que se distribuirá con una librería para que las
aplicaciones que tengan que integrarse con nuestra aplicación lo hagan utilizando esta librería.
Los clientes de servicio web ATLAS se caracterizan por que no se generan a partir de un descriptor WSDL del
servicio sino que se parte de la clase de la interfaz del servicio y de las clases que representen a los parámetros
del mismo. La invocación a los métodos del servicio web va a ser dinámica. Para facilitar esta invocación dinámica
dentro del framework Atlas existen varias clases base para la creación de clientes de servicio web, en el caso
actual hablamos de clientes seguros con validación de certificado.
AtlasSecuredWSClient: esta clase es la utilizada para servidores con seguridad a nivel de mensaje a
través de WS-Security + Seguridad de transporte con certificado de cliente
40 de 106
Framework Atlas
Manual usuario de Servicios Web
ClienteMiPrimerService.java
package prueba123.client;
import java.util.Properties;
import prueba123.services.MiPrimerService;
import atlas.clientews.client.AtlasSecuredWSClient;
import atlas.core.exceptions.ServiceException;
/** Propiedades */
private Properties properties;
@Override
public String getFechaString() throws ServiceException {
/**
* Establece el valor de las propiedades
* @param properties las propiedades
*/
public void setProperties(Properties properties) {
this.properties = properties;
}
}
41 de 106
Framework Atlas
Manual usuario de Servicios Web
En este documento se diferencian dos formas de acceder a un servicio web. Si queremos acceder a un servicio
web creado con ATLAS, es mucho más fácil ya que al crear el servicio web se generó una librería preparada para
usarla desde la parte cliente. Si no se trata de un servicio web creado con ATLAS, entonces se tendrá que partir
del fichero WSDL que describe el servicio web, y generar las clases a partir de éste.
Para usar un servicio web creado con ATLAS debemos disponer de la librería que se generó junto con el
servicio web. A continuación se describen los pasos para incorporar dicha librería en nuestro proyecto y definir las
propiedades de conexión al servicio web.
Para usar la librería generada en nuestro proyecto, será necesario realizar la inclusión de esta dependencia en el
fichero pom.xml, según se muestra a continuación:
<dependencies>
[...]
<dependency>
<groupId>xxxx</groupId>
<artifactId>xxxx_ws_lib</artifactId>
<version>y.y.y</version>
</dependency>
[...]
</dependencies>
Los valores de las distintas variables nos los deben proporcionar los responsables de dicha librería.
Para usar la librería correctamente debemos modificar el fichero de configuración de Spring de nuestro proyecto
denominado applicationContext-services.xml, incluyendo la línea que importa el fichero de contexto de la librería
(modificar xxxx_ws_lib por el nombre del fichero de contexto que aparece dentro de la librería):
applicationContext-services.xml de proyecto
<beans>
[...]
<!-- Importar fichero de contexto de la librería -->
<!-- contiene definición de bean 'miServicioWeb' -->
<import resource="classpath:/conf/applicationContext-xxxx_ws_lib.xml" />
[...]
42 de 106
Framework Atlas
Manual usuario de Servicios Web
El último paso para configurar la URL de conexión al servicio web es definir una nueva variable en el fichero
src/main/resources/environment.properties de nuestra aplicación, según se muestra a continuación:
src/main/resources/environment.properties de proyecto
[...]
[...]
Sustituir ejemplo_ws por el módulo técnino del web servce y MiServicioWeb por el nombre del servicio web al que
se llama.
ATENCION
Recordar que cada vez que se modifica el valor de una variable en el fichero
src/main/resources/environment.properties es necesario también modificar todos los ficheros
war/<nombreEntorno>/environment.properties para incluir la nueva variable.
43 de 106
Framework Atlas
Manual usuario de Servicios Web
Para realizar llamadas a un servicio web de atlas que dispone de seguridad a nivel de transporte con certificado de
cliente, es necesario realizar los siguientes pasos:
src/main/resources/environment.properties de proyecto
[...]
# Ids de aplicacion
app.id.asf=EJPL_WS_CLIENTE
[...]
44 de 106
Framework Atlas
Manual usuario de Servicios Web
Además es necesario modificar en el fichero de contexto de Spring del modulo lib (applicationcontext-
xxxx_ws_lib.xml) el bean del cliente para añadirles las propiedades relacionadas con la seguridad tal y como se
puede ver en este ejemplo:
applicationContext-xxxx_ws_lib.xml
<beans>
…
<bean id="miPrimerService" class="prueba123.client.ClienteMiPrimerService">
<constructor-arg value="${miPrimerService.endpoint}" />
<property name="properties">
<props>
<prop key="keyStorePath">${https.keystore.path}</prop>
<prop key="keyStorePassword">${https.keystore.pass}</prop>
<prop key="securePort">${https.secure.port}</prop>
</props>
</property>
</bean>
</beans>
El bloque marcado en amarillo tendrá que añadirse tal cual pero modificando los nombre de las variables:
El bloque marcado en amarillo tendrá que añadirse sin modificaciones a la definición del cliente. Y por último,
deberán añadirse al fichero environment.properties para los test unitarios las propiedades definidas en el
fichero de Spring para el servicio:
src/test/resources/environment.properties
# Ids de aplicacion
app.id.asf=EJPL_WS_CLIENTE
Ver el apartado “7.- Obtención de los keystores” para ver como obtener
y configurar los keystores de la aplciación
45 de 106
Framework Atlas
Manual usuario de Servicios Web
46 de 106
Framework Atlas
Manual usuario de Servicios Web
Para realizar llamadas a un servicio web de atlas que dispone de seguridad a nivel de mensaje, tenemos que
realizar las siguientes modificaciones en nuestro cliente.
src/main/resources/environment.properties de proyecto
[...]
# Ids de aplicacion
app.id.asf=EJPL_WS_CLIENTE
[...]
47 de 106
Framework Atlas
Manual usuario de Servicios Web
Además es necesario modificar en el fichero de contexto de Spring del modulo lib (applicationcontext-
xxxx_ws_lib.xml) el bean del cliente para añadirles las propiedades relacionadas con la seguridad tal y como se
puede ver en este ejemplo:
applicationContext-xxxx_ws_lib.xml
<beans>
…
<bean id="miPrimerService" class="prueba123.client.ClienteMiPrimerService">
<constructor-arg value="${miPrimerService.endpoint}" />
<property name="properties">
<props>
<prop key="policyPath">META-INF/politicaWSSFirmado.xml</prop>
<prop key="invokingApp">${app.id.asf}</prop>
<prop key="operationMode">client</prop>
<prop key="localKey">${miPrimerService.localKey}</prop>
<prop key="remoteKey">${miPrimerService.remoteKey}</prop>
<prop key="wsuTsLife">300000</prop>
</props>
</property>
</bean>
</beans>
El bloque marcado en amarillo tendrá que añadirse tal cual pero modificando los nombre de las variables:
El siguiente paso es definir las propiedades de ASF indicadas para el CLIENTE en el fichero de configuración del
módulo lib para poder hacer las pruebas con los Test Unitarios.
48 de 106
Framework Atlas
Manual usuario de Servicios Web
Fichero lib/src/test/resources/environment.properties
[...]
# Ids de aplicacion
app.id.asf= ejpl_ws_cliente
# Datos de WS
miPrimerService.endpoint=http://localhost:9080/services/MiServicioWeb
miPrimerService.localKey=cliente_ws
miPrimerService.remoteKey=servidor_ws_cert
[...]
49 de 106
Framework Atlas
Manual usuario de Servicios Web
Para realizar llamadas a un servicio web de atlas que dispone de seguridad a nivel de mensaje más seguridad a
nivel de transporte con certificado de cliente, tenemos que realizar las siguientes modificaciones en nuestro cliente.
ATENCION
Esta configuración de cliente es solo para Servicios Web ATLAS que dispongan de seguridad
tanto a nivel de mensaje como a nivel de transporte CON certificado de cliente.
En caso de no tener que certificar nuestro acceso con un certificado, seguir los pasos del punto
anterior.
src/main/resources/environment.properties de proyecto
[...]
# Ids de aplicacion
app.id.asf=EJPL_WS_CLIENTE
[...]
50 de 106
Framework Atlas
Manual usuario de Servicios Web
Ver el apartado “7.- Obtención de los keystores” para ver como obtener
y configurar los keystores de la aplciación
51 de 106
Framework Atlas
Manual usuario de Servicios Web
Además es necesario modificar en el fichero de contexto de Spring del modulo lib (applicationcontext-
xxxx_ws_lib.xml) el bean del cliente para añadirles las propiedades relacionadas con la seguridad tal y como se
puede ver en este ejemplo:
applicationContext-xxxx_ws_lib.xml
<beans>
…
<bean id="miPrimerService" class="prueba123.client.ClienteMiPrimerService">
<constructor-arg value="${miPrimerService.endpoint}" />
<property name="properties">
<props>
<prop key="policyPath">META-INF/politicaWSSFirmado.xml</prop>
<prop key="invokingApp">${app.id.asf}</prop>
<prop key="operationMode">client</prop>
<prop key="localKey">${miPrimerService.localKey}</prop>
<prop key="remoteKey">${miPrimerService.remoteKey}</prop>
<prop key="wsuTsLife">300000</prop>
<prop key="keyStorePath">${https.keystore.path}</prop>
<prop key="keyStorePassword">${https.keystore.pass}</prop>
<prop key="securePort">${https.secure.port}</prop>
</props>
</property>
</bean>
</beans>
El bloque marcado en amarillo tendrá que añadirse tal cual pero modificando los nombre de las variables:
El siguiente paso es definir las propiedades de ASF indicadas para el CLIENTE en el fichero de configuración del
módulo lib para poder hacer las pruebas con los Test Unitarios.
52 de 106
Framework Atlas
Manual usuario de Servicios Web
Fichero lib/src/test/resources/environment.properties
[...]
# Ids de aplicacion
app.id.asf= ejpl_ws_cliente
# Datos de WS
miPrimerService.endpoint=http://localhost:9080/services/MiServicioWeb
miPrimerService.localKey=cliente_ws
miPrimerService.remoteKey=servidor_ws_cert
[...]
53 de 106
Framework Atlas
Manual usuario de Servicios Web
Ver el apartado “7.- Obtención de los keystores” para ver como obtener
y configurar los keystores de la aplciación
54 de 106
Framework Atlas
Manual usuario de Servicios Web
Cuando se necesite conectar a un servicio web externo, se utilizarán los siguientes pasos para la creación de un
cliente de servicio web. Los clientes de servicio web NO ATLAS se caracterizan por ser de código generado a partir
de un descriptor WSDL. A diferencia del cliente de servicio web ATLAS, este cliente debe generarse en cada
proyecto en que se quiera establecer comunicación con un servicio web. Para generar un cliente a partir de un
fichero WSDL será necesario hacer uso del módulo maven de ATLAS llamado altasfrm-clientews-wsdl2code-
maven-plugin.
ATENCION
Este tipo de cliente de servicio web, es para los clientes que no requieran seguridad a nivel de
mensaje ni seguridad a nivel de transporte con certificado de cliente.
Esta configuración es apta tanto para HTTP como para HTTPS. Siempre y cuando el transporte
NO requiera certificado de cliente.
El fichero wsdl que nos hayan proporcionado hay que incluirlo en el proyecto en la carpeta
src/main/resources/wsdl. Del módulo lib del arquetipo generado
Añadir en la siguiente dependencia en el fichero pom.xml (del modulo lib) del proyecto donde se vaya a generar el
cliente compilado:
pom.xml
<dependency>
<groupId>atlasfrm</groupId>
<artifactId>atlasfrm-clientews-lib</artifactId>
<version>${atlasfrm-clientews-lib.version}</version>
<scope>provided</scope>
</dependency>
Dentro de la sección de plugins del fichero pom.xml de nuestro proyecto es necesario incluir el plugin de Maven
atlasfrm-clientews-wsdl2code-maven-plugin. Este plugin generará tanto las clases de cliente del webservice
como las clases de tests para las pruebas contra dicho servicio. A continuación se muestra un ejemplo de
configuración del plugin:
55 de 106
Framework Atlas
Manual usuario de Servicios Web
ATENCION
Según la configuración anterior a partir del fichero yyyyyService.wsdl se generarán las clases cliente del servicio
yyyyyService en el directorio src/main/java en el paquete xxxx.ws.client.yyyyyService (suponiendo que
yyyyyService sea el nombre del servicio). También se generará un fichero applicationContext-
yyyyyService.xml en el directorio src/main/resources, para que el cliente esté dado de alta en el contexto de
Spring. Puede ser necesario incluir manualmente en los configLocations del fichero web.xml este nuevo archivo
de definiciones.
Además se generarán los test unitarios del servicio en el directorio src/test/java, en el mismo paquete en que se
han generado las clases del cliente. El test unitario contendrá el fichero de definiciones de Spring creado para el
servicio.
En caso de tener que generar varios clientes de servicio web, se deberán generarse tantos tags <execution>
como clientes deban generarse, cada uno con su configuración.
Los parámetros que se pueden configurar en este plugin son, además de los propios del plugin wsdl2code-
maven-plugin (y que podemos encontrar descrita en la siguiente url: http://ws.apache.org/axis2/tools/1_4/maven-
plugins/maven-wsdl2code-plugin.html), los incluidos en la siguiente tabla:
56 de 106
Framework Atlas
Manual usuario de Servicios Web
generateTestcase Indica si generar o no una clase de test para Por defecto: true
el cliente de webservice.
generateServerSideInterf Genera el intefaz java del servicio web Por defecto: true
ace
57 de 106
Framework Atlas
Manual usuario de Servicios Web
namespaceToPackages Lista de Namespaces del fichero WSDL Por defecto: todas las clases se
relacionandolos con nombres de paquete generan en el mismo paquete
para generar en estas ubicaciones los datos del cliente del servicio web.
asociados a cada Namespace.
Una vez que este plugin está configurado se puede pasar a la generación de las clases del cliente del servicio web.
La generación a partir del plugin atlas-wsdl2code-maven-plugin se basa en el documento WSDL para generar el
cliente. A continuación de muestra un ejemplo de generación en el módulo lib para el servicio MiServicioWeb. La
configuración del plugin es:
pom.xml
<plugin>
<groupId>atlasfrm</groupId>
<artifactId>atlasfrm-clientews-wsdl2code-maven-plugin</artifactId>
<version>${atlasfrm-clientews-wsdl2code-plugin.version}</version>
<configuration>
<packageName>prueba123.ws.client</packageName>
<serviceNameAsPackage>true</serviceNameAsPackage>
<overWrite>false</overWrite>
</configuration>
<executions>
<execution>
<id>miPrimerService</id>
<configuration>
<wsdlFile>src/main/resources/wsdl/miPrimerService.wsdl</wsdlFile>
</configuration>
<goals>
<goal>wsdl2code</goal>
</goals>
</execution>
</executions>
</plugin>
Para que se generen las clases del cliente simplemente hay que compilar el proyecto. Para que las clases
generadas aparezcan en Eclipse es necesario refrescar el proyecto.
58 de 106
Framework Atlas
Manual usuario de Servicios Web
Una vez generadas las clases del cliente, el fichero de Spring y el test unitario, habrá que editar este último para
proporcionar datos para las llamadas que reciban parámetros. Si no se modifica el fichero de test para añadir estos
datos, el test unitario fallará. En cada método de test en que sea necesario aportar datos para hacer la llamada, se
generará un comentario como el siguiente para indicar el sitio donde introducir estos:
TestCase.java
// TODO : Rellenar aquí los valores de xxxxxxxxxxxxxx
// El test unitario no ejecutara correctamente hasta que no se
// rellenen valores correctos
Es importante revisar los ficheros de contexto de String incluidos en el test a ver si son los correspondientes a los
de la aplicación en la que se está generando el cliente para ver si son los correctos y en su caso modificarlos para
que funcione correctamente.
59 de 106
Framework Atlas
Manual usuario de Servicios Web
En este apartado se demostrará el uso del cliente generado. Se utilizará como ejemplo el cliente del servicio
MiServicioWeb generado en apartados anteriores.
ATENCION
Esta configuración, es para clientes que necesiten conectarse a un servicio web no altas
(externo) mediante:
HTTP
HTTPS sin certificado de cliente.
El certificado del servidor para los transportes HTTPS se encuentra en los almacenes de
confianza utilizados por ICM. En caso de que el servidor al que queramos conectar disponga de
un certificado que ICM no contempla, pedid a la unidad de arquitectura la incorporación de dicho
certificado a su almacen.
La primera modificación que habrá que hacer al código generado será parametrizar el endpoint por defecto en el
fichero „environment.properties‟ (marcado en amarillo). Para ello habrá de consultarse el fichero de Spring
generado para el servicio. En los comentarios de la definición de este servicio se indicará que variable ha de darse
de alta:
applicationContext-MiServicioWeb.xml
<!-- ================================================================
Definición de ws 'MiServicioWeb'.
*** ATENCIÓN *** Añadir en environment.properties:
miServicioWeb.endpoint=http://...
================================================================ -->
<bean id="miServicioWeb" class="atlas.clientews.client.ClientFactory" ...>
<constructor-arg value="atlas.ws...MiServicioWebStub" />
<constructor-arg type="..." value="${miServicioWeb.endpoint}" />
</bean>
Sustituir ejemplo_ws por el módulo técnino del web servce y MiServicioWeb por el nombre del servicio web al que
se llama.
ATENCIÓN
60 de 106
Framework Atlas
Manual usuario de Servicios Web
Los parámetros „endpoint’ han de crearse en TODOS los ficheros environment.properties del proyecto donde se
usará la librería cliente, aunque no se sepan las URLs en los distintos entornos.
A continuación se ha de incluir la definición del invocador en el contexto de Spring en el proyecto donde se hará
uso de la librería cliente. La forma recomendada de cargar el fichero de Spring es mediante una sentencia include
en el fichero de servicios.
applicationContext-services.xml
<beans>
<import resource="applicationContext-MiServicioWeb.xml"/>
[...]
</beans>
En este mismo fichero applicationContext-services.xml están las definiciones de los servicios del proyecto. Debe
añadirse la dependencia como se haría con cualquier otro servicio del proyecto. Una vez añadida, podrán
implementarse métodos de uso en esta que utilicen el invocador creado.
applicationContext-services.xml
<beans>
<import resource="applicationContext-MiServicioWeb.xml"/>
<!-- ============================================================== -->
<!-- Definición de todos los servicios de la aplicación -->
<!-- ============================================================== -->
<bean id="miServicio" class="atlasfrm...services.MiServicioImpl"
p:miServicioWeb-ref="MiServicioWeb"
/>
[...]
</beans>
MiServicioImpl.java
61 de 106
Framework Atlas
Manual usuario de Servicios Web
@Service
public class MiServicioImpl implements MiServicio {
/**
* Llamada al WS de Ejemplo
* @return String
*/
public String getFechaString() throws java.lang.Exception {
assertNotNull(result);
return null;
ATENCION
Para simplificar el uso de clientes compilados, estos pueden ser inyectados en un servicio si
requieren de lógicas de proceso y manipulación de los objetos del cliente compilado (objeto
DatosEntrada en el ejemplo anterior).
62 de 106
Framework Atlas
Manual usuario de Servicios Web
En ocasiones necesitaremos la creación de un cliente de servicio web que conecte con el servidor externo usando
un certificado de cliente. Esto significa que el servidor, comprobará los clientes que se conecten a través de
HTTPS, y requerirá un certificado al cliente que verificará si es correcto o no.
En este apartado se demostrará el uso del cliente generado. Se utilizará como ejemplo el cliente del servicio
MiServicioWeb generado en apartados anteriores.
ATENCION
Esta configuración, es para clientes que necesiten conectarse a un servicio web no altas
(externo) mediante:
HTTPS con certificado de cliente.
La seguridad a nivel de transporte (HTTPS) puede llevar o no verificación de cliente.
Esto significa que los clientes que conectan al servicio web requieren de un certificado que el
servidor comprobará.
Esta configuración es solo para los casos descritos, si se necesita un cliente de servicio web con
seguridad a nivel de transporte (HTTPS) sin certificado de cliente, consultar el punto anterior:
WS EXTERNOS (NO ATLAS) - CREACIÓN DE UN CLIENTE (HTTP y HTTPS SIN
CERTIFICADO CLIENTE)
La primera modificación que habrá que hacer al código generado será parametrizar el endpoint por defecto en el
fichero „environment.properties‟ (marcado en amarillo). Para ello habrá de consultarse el fichero de Spring
generado para el servicio. En los comentarios de la definición de este servicio se indicará que variable ha de darse
de alta:
applicationContext-MiServicioWebHttps.xml
<beans>
[...]
<bean id="MiServicioWebHttps" class="atlas.clientews.client.HttpsClientFactory">
<constructor-arg value="ejpl.services.MiServicioWebHttpsStub" />
<constructor-arg type="java.lang.String" value="${miServicioWebHttps.endpoint}" />
</bean>
[...]
</beans>
63 de 106
Framework Atlas
Manual usuario de Servicios Web
Además de este cambio, también tendrán que definirse las credenciales de seguridad, especificando donde se
encuentra nuestro certificado de cliente:
applicationContext-EjemploServicioHttps.xml
<beans>
[...]
<bean id="MiServicioWebHttps" class="atlas.clientews.client.HttpsClientFactory">
<constructor-arg value="ejpl.services.MiServicioWebHttpsStub" />
<constructor-arg type="java.lang.String" value="${MiServicioWebHttps.endpoint}" />
<property name="properties">
<props>
<prop key="keyStorePath">${https.keystore.path}</prop>
<prop key="keyStorePassword">${https.keystore.pass}</prop>
<prop key="securePort">${https.secure.port}</prop>
</props>
</property>
</bean>
[...]
</beans>
El bloque marcado en amarillo tendrá que añadirse sin modificaciones a la definición del cliente. Y por último,
deberán añadirse al fichero environment.properties las propiedades definidas en el fichero de Spring para el
servicio:
src/test/resources/environment.properties
# Ids de aplicacion
app.id.asf=EJPL_WS_CLIENTE
ATENCION
Los valores de los parametros de contraseñas (https.keystore.pass) han de ser cifrados antes
de configurarlos en el fichero environment.properties.
64 de 106
Framework Atlas
Manual usuario de Servicios Web
Ver el apartado “7.- Obtención de los keystores” para ver como obtener
y configurar los keystores de la aplciación
Para la creación de un cliente de servicio web con seguridad a nivel de mensaje, utilizaremos WS-Security, cuya
configuración es sencilla.
ATENCION
Esta configuración, es para clientes que necesiten conectarse a un servicio web no altas
(externo) mediante:
HTTP + seguridad a nivel de mensaje WS-Security Firmado o Firmado y Cifrado
HTTPS sin certificado de cliente + seguridad a nivel de mensaje WS-Security Firmado o
Firmado y Cifrado
La seguridad a nivel de mensaje significa que el canal (el transporte) puede ser o no seguro, en
ambos casos, si no requiere de certificado de cliente, no hay que configurar nada más que los
siguientes pasos, es decir, solo hay que configurar la seguridad WS-Security, tanto como si el
canal es HTTP como HTTPS
applicationContext-EjemploServicioSeguro.xml
65 de 106
Framework Atlas
Manual usuario de Servicios Web
<beans>
[...]
<bean id="miServicioWeb" class="atlas.clientews.client.SecureClientFactory">
<constructor-arg value="ejpl.services.MiServicioWebStub" />
<constructor-arg type="java.lang.String" value="${miServicioWeb.endpoint}" />
[...]
</beans>
Además de este cambio, también tendrán que definirse las credenciales de seguridad:
applicationContext-.xml
<beans>
[...]
<property name="properties">
<props>
<prop key="invokingApp">${app.id.asf}</prop>
<prop key="operationMode">client</prop>
<prop key="localKey">${miServicioWeb.localKey}</prop>
<prop key="remoteKey">${miServicioWeb.remoteKey}</prop>
<prop key="wsuTsLife">300000</prop>
</props>
</property>
</bean>
[...]
</beans>
ATENCION
El bloque marcado en amarillo tendrá que añadirse tal cual pero modificando los nombre de las variables:
66 de 106
Framework Atlas
Manual usuario de Servicios Web
politicaWSSFirmadoCifrado.xml
Y por último, deberán añadirse al fichero environment.properties las propiedades definidas en el fichero de
Spring para el servicio:
src/test/resources/environment.properties
# Ids de aplicacion
app.id.asf=EJPL_WS_CLIENTE
# Datos de WS
miServicioWeb.endpoint=http://localhost:9080/services/MiServicioWeb
miServicioWeb.localKey=cliente_ws
miServicioWeb.remoteKey=servidor_ws_cert
ATENCION
Para poder incluir WS en un cliente de un servicio web es necesario previamente dar de alta la aplicación en ASF
tal y como se describe en el apartado 3.2 Los valores de localKey y remoteKey serán los alias de los certificados
asociados a la aplicación en ASF.
Para la creación de un cliente de servicio web con seguridad a nivel de mensaje, utilizaremos WS-Security,
además si el servidor requiere certificado de cliente, añadiremos también la configuración para el canal HTTPS con
certificado.
67 de 106
Framework Atlas
Manual usuario de Servicios Web
ATENCION
Esta configuración, es para clientes que necesiten conectarse a un servicio web no altas
(externo) mediante:
HTTPS con certificado de cliente + seguridad a nivel de mensaje WS-Security Firmado o
Firmado y Cifrado
Esta configuración es seguridad a nivel de transporte con certificado de cliente y seguridad a
nivel de mensaje con WS-Security.
Debemos configurar ambas opciones de seguridad. Si el cliente que debemos realizar es con
seguridad a nivel de mensaje a través de canal seguro (HTTPS), debemos saber si el servidor
comprobará los clientes que intenten contectarse. Si el servidor acepta todas las conexiones
HTTPS, la configuración a elegir es la del punto anterior:
WS EXTERNOS (NO ATLAS) - CREACIÓN DE UN CLIENTE CON SEGURIDAD EN MENSAJE
WS-SECURITY
La configuración de WS-Secrurity es la misma que el punto anterior, solo que en la configuración de Spring,
realizaremos el siguiente cambio:
applicationContext-.xml
<beans>
[...]
<property name="properties">
<props>
<prop key="invokingApp">${app.id.asf}</prop>
<prop key="operationMode">client</prop>
<prop key="localKey">${miServicioWeb.localKey}</prop>
<prop key="remoteKey">${miServicioWeb.remoteKey}</prop>
<prop key="wsuTsLife">300000</prop>
<prop key="keyStorePath">${https.keystore.path}</prop>
<prop key="keyStorePassword">${https.keystore.pass}</prop>
<prop key="securePort">${https.secure.port}</prop>
</props>
</property>
</bean>
[...]
</beans>
68 de 106
Framework Atlas
Manual usuario de Servicios Web
El bloque marcado en amarillo tendrá que añadirse sin modificaciones a la definición del cliente. Y por último,
deberán añadirse al fichero environment.properties las propiedades definidas en el fichero de Spring para el
servicio:
src/test/resources/environment.properties
# Ids de aplicacion
app.id.asf=EJPL_WS_CLIENTE
Ver el apartado “7.- Obtención de los keystores” para ver como obtener
y configurar los keystores de la aplciación
69 de 106
Framework Atlas
Manual usuario de Servicios Web
6. CONFIGURACIONES ADICIONALES
En los siguientes apartados, se explica cómo agregar opciones extras en los servicios web si fuera necesario.
Es muy probable que para llamar a un servicio web externo sea necesaria la configuración del proxy para que
nuestro cliente pueda conectar a la URL indicada por el servidor.
El proxy solo será necesario para clientes NO atlas (generados a partir de WSDL) ya que para clientes atlas no es
necesario proxy.
Lo único que tenemos que hacer es añadir los siguientes parámetros en nuestra configuración de Spring del cliente
del servicio Web:
applicationContext-MiServicioWeb.xml
<!-- ================================================================
Definición de ws 'MiServicioWeb'.
*** ATENCIÓN *** Añadir en environment.properties:
miServicioWeb.endpoint=http://...
================================================================ -->
<bean id="miServicioWeb" class="atlas.clientews.client.ClientFactory" ...>
<constructor-arg value="atlas.ws...MiServicioWebStub" />
<constructor-arg type="..." value="${miServicioWeb.endpoint}" />
<property name="properties">
<props>
…
<prop key="proxy.activo">${http.proxyActivo}</prop>
<prop key="proxy.host">${http.proxyHost}</prop>
<prop key="proxy.port">${http.proxyPort}</prop>
<prop key="proxy.user">${http.proxyUser}</prop>
<prop key="proxy.password">${http.proxyPassword}</prop>
…
</props>
</property>
</bean>
ATENCION
La clase marcada en azul puede ser diferente dependiendo del cliente generado, en el ejemplo
es un cliente No seguro HTTP o HTTPS sin certificado de cliente, pero podría ser otro de los
casos descritos en el manual.
Tan solo tendremos que parametrizar la variables del proxy en el fichero „environment.properties‟, ingresar los
valores correctos para host, puerto, usuario y clave de acceso al proxy:
70 de 106
Framework Atlas
Manual usuario de Servicios Web
Para agregar un timeout a un cliente de un servicio web se deberá agregar dicho tiempo al constructor del stub del
servicio web. A continuación se muestra un ejemplo, las líneas que hay que agregar están resaltadas en color
amarillo, concretamente el método setTimeOutInMilliSeconds.
MiServicioImpl.java
71 de 106
Framework Atlas
Manual usuario de Servicios Web
@Service
public class MiServicioImpl implements MiServicio {
[. . .]
/**
* Constructor that takes in a configContext and useseperate listner
*/
public MiServicioWebStub(org.apache.axis2.context.ConfigurationContext
configurationContext, String targetEndpoint, boolean useSeparateListener)
throws org.apache.axis2.AxisFault {
//To populate AxisService
populateAxisService();
populateFaults();
_serviceClient = new
org.apache.axis2.client.ServiceClient(configurationContext,_service);
_serviceClient.getOptions().setTo(new org.apache.axis2.addressing.EndpointReference(
targetEndpoint));
_serviceClient.getOptions().setUseSeparateListener(useSeparateListener);
[. . .]
6.1.3. Llamadas a Servicios Web Con Usuario y Password usando HHTP Basic
En caso de que dispongamos de la necesidad de llamar a un Servicio Web que requiere una autenticación de
usuario y password mediante transporte http Básico, con un cliente NO ATLAS, será necesario modificar el código
generado en nuestra clase Stub, de tal manera que al realizar la llamada al constructor desde Spring se incluya la
seguridad requerida.
Al crear el objeto con Spring, utilizamos el constructor ya autogenerado de 3 parámetros, endpoint, username y
password (obtenidos de nuestro enviroment.properties):
applicationContext(nombreWS)Service.xml
72 de 106
Framework Atlas
Manual usuario de Servicios Web
=============================================================================== -->
<bean id="SI_ConsultasGastos_OutService"
class="gtri.client.nexus.si_consultasgastos_outservice.SI_ConsultasGastos_OutServiceStub">
<constructor-arg type="java.lang.String"
value="${sI_ConsultasGastos_OutService.endpoint}" />
<constructor-arg type="java.lang.String"
value="${sI_ConsultasGastos_OutService.username}" />
<constructor-arg type="java.lang.String"
value="${sI_ConsultasGastos_OutService.password}" />
</bean>
_serviceClient.getOptions().setUserName(userName);
_serviceClient.getOptions().setPassword(password);
}
El cual, debe ser sustituido por lo siguiente para habilitar la autenticación Básica:
73 de 106
Framework Atlas
Manual usuario de Servicios Web
/**
* Constructor that takes in a configContext and useseperate listner
*/
public SI_ConsultasGastos_OutServiceStub(java.lang.String targetEndpoint,
java.lang.String userName, java.lang.String password)
throws org.apache.axis2.AxisFault {
//Resto de codigo
Como ya hemos explicado en el resto de apartados, no se debe configurar en los clientes de Axis, tanto atlas como
externos, ningún almacén de confianza a la hora de llamar a los servicios web.
No obstante, esta configuración es sólo válida para los entornos de ICM (desarrollo, validación, producción, etc),
para el correcto funcionamiento en local, hay que seguir los siguientes pasos:
ATENCION
74 de 106
Framework Atlas
Manual usuario de Servicios Web
Por defecto, axis utiliza el almacén de la máquina virtual de java (cacerts) al ejecutarse. A partir
de la versión 1.2.9 de atlas se cambia este comportamiento, en caso de disponer una versión
anterior, es necesario incluir el siguiente código (versión mínima 1.2.7) sobre el fichero pom.xml
del módulo Web de nuestra aplicación, sobre el plugin de Tomcat, en el tag “systemProperties”
añadir las 2 siguientes propiedades
…
<systemProperties>
<log4j.configuration>log4j.xml</log4j.configuration>
<javax.net.ssl.trustStore>
${project.build.testOutputDirectory}/ssl/truststore.keystore
</javax.net.ssl.trustStore>
<javax.net.ssl.trustStorePassword>
desarrollo
</javax.net.ssl.trustStorePassword>
</systemProperties>
…
…
<systemProperties>
<log4j.configuration>log4j.xml</log4j.configuration>
<javax.net.ssl.trustStore>
${project.build.testOutputDirectory}/ssl/truststore.keystore
</javax.net.ssl.trustStore>
<javax.net.ssl.trustStorePassword>
desarrollo
</javax.net.ssl.trustStorePassword>
<javax.net.ssl.keyStore>
${project.build.testOutputDirectory}/ssl/keystore.keystore
</javax.net.ssl.keyStore>
<javax.net.ssl.keyStorePassword>
desarrollo
</javax.net.ssl.keyStorePassword>
</systemProperties>
…
Los almacenes que generan los arquetipos están preparados con las CA‟s de prueba de ICM, no obstante, en caso
de necesitar agregar más entradas a dichos almacenes, lo haremos siguiendo los siguientes pasos:
Haremos uso de la utilidad proporcionada por Java, Keytool, para realizar esta operación.
Paso 1
Copiamos el almacén utilizado por las aplicaciones de atlas, localizado en la carpeta “test”:
75 de 106
Framework Atlas
Manual usuario de Servicios Web
Paso 2
Recuperamos certificado de servidor
Para recuperar el certificado del servidor, podemos hacerlo a través del navegador:
76 de 106
Framework Atlas
Manual usuario de Servicios Web
Pulsamos en Datos del certificado, en la pestaña Detalles hacemos click en botón “Copiar en Archivo”
77 de 106
Framework Atlas
Manual usuario de Servicios Web
Copiamos el fichero del certificado de servidor, para que se ubique en la misma ruta:
ATENCION
78 de 106
Framework Atlas
Manual usuario de Servicios Web
Una vez estemos posicionados en dicha ruta con el almacén y el certificado a importar, podremos ejecutar la
utilidad java para importar certificados, abrimos consola de comandos y nos posicionamos en la carpeta bin:
La consola de comandos se abrirá y nos posicionamos sobre la carpeta con el comando “cd”
cd C:\Archivos de programa\Java\jdk1.6.0_45\bin
ATENCION
79 de 106
Framework Atlas
Manual usuario de Servicios Web
Es probable que la ruta por defecto al ejecutar cmd sea una unidad diferente de donde está
instalado Java, para cambiar de unidad tan solo tenemos que escribir la letra de la unidad
seguido de :
Tal que así:
C:
Una vez posicionados en la carpeta donde tenemos nuestro almacén y certificado, realizamos el siguiente
comando:
La contraseña del almacén de certificados incluido con las aplicaciones de altas es: desarrollo
Escribiendo desarrollo y pulsando intro nos importará el certificado al almacén, como último paso solo nos queda
copiar el fichero truststore.keystore a su ruta original:
80 de 106
Framework Atlas
Manual usuario de Servicios Web
81 de 106
Framework Atlas
Manual usuario de Servicios Web
UTILIDADES
A continuación se muestran las distintas utilidades del framework para facilitar los desarrollos de servicios web.
82 de 106
Framework Atlas
Manual usuario de Servicios Web
Este módulo de log permitirá visualizar en trazas todos los mensajes enviados y recibidos por un cliente o servicio
web. A continuación se muestra un ejemplo de la salida de este módulo:
ATENCION
Para poder activar la salida de log tanto en clientes como en servicios web, será necesario realizar las siguientes
acciones:
Paso 1: incluir la dependencia en el fichero pom.xml (en los arquetipos de servicio web ya está incluida).
pom.xml
<dependencies>
[...]
<!-- Descomentar esta dependencia si se desea ver en el log los mensajes
de entrada y salida de los servicios web. NO activar en producción
ya que creará un fichero mar por cada petición al WS -->
<dependency>
<groupId>atlasfrm</groupId>
<artifactId>atlasfrm-clientews-message-logger-lib</artifactId>
<version>${atlasfrm-clientews-message-logger-lib.version}</version>
<type>mar</type>
</dependency>
[...]
</dependencies>
83 de 106
Framework Atlas
Manual usuario de Servicios Web
84 de 106
Framework Atlas
Manual usuario de Servicios Web
log4j.xml
Paso 3: solo en el caso del servicio web (los clientes activarán el módulo si está disponible como
dependencia), habrá que activar el módulo en el fichero services.xml para cada servicio.
services.xml
<service name="EjemploServicioNoSeguro">
[...]
<messageReceivers>
[...]
</messageReceivers>
</service>
En algunas situaciones es necesario personalizar los mensajes Soap Fault que se retornan como resultado de un
error de aplicación o de seguridad. Las excepciones de seguridad pueden producir mensajes Soap Fault
personalizados a las necesidades funcionales con las siguientes instrucciones:
atlas.clientews.fault.SoapFaultProvider
85 de 106
Framework Atlas
Manual usuario de Servicios Web
/**
* Método al que se llamará desde el Framework cuando se
* produzca una excepción
*
* @param msgCtx contexto del mensaje de Axis2
* @param t excepcion producida durante la validación o
* procesamiento del mensaje
* @throws AxisFault
*/
void processException(MessageContext msgCtx, AtlasSecurityException t)
throws AxisFault;
}
Esta interfaz solo contiene un método processException al que se le pasan dos parámetros: el contexto del
mensaje de Axis 2 y la excepción de seguridad lanzada. La implementación de este método deberá lanzar una
excepción AxisFault personalizada con la que Axis 2 generará el mensaje Soap Fault.
Para que ATLAS pueda delegar la gestión del error a la implementación de SoapFaultProvider, se deberá
configurar el parámetro errorTranslator en el fichero services.xml como un parámetro del servicio:
services.xml
<service name="EjemploServiceWSS2">
<parameter name="...</parameter>
...
<parameter name="errorTranslator">mi.gestor.de.excepciones</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
...
El gestor de errores Soap Fault por defecto del framework es la clase atlas.clientews.fault.
DefaultSoapFaultProvider.
La especificación SCSPv3 se encarga de definir las comunicaciones de servicios web entre las distintas
administraciones públicas. En ATLAS se ha dado soporte a la especificación de Soap Fault a través de la
implementación atlas.clientews.fault.SCSP3SoapFaultProvider. La configuración debe realizarse según el apartado
anterior:
86 de 106
Framework Atlas
Manual usuario de Servicios Web
<service name="EjemploServiceWSS2">
<parameter name="...</parameter>
...
<parameter name="errorTranslator">atlas.clientews.fault.SCSP3SoapFaultProvider</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
...
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault>
<faultcode xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-
200401-wss-wssecurity-secext-1.0.xsd">wsse:InvalidSecurity</faultcode>
<faultstring>[0302] Certificado caducado</faultstring>
<detail>
<Atributos
xmlns="http://intermediacion.redsara.es/scsp/esquemas/V3/soapfaultatributos">
<IdPeticion>001_DIR_MINHAP_FNUX0_9CC4</IdPeticion>
<NumElementos>1</NumElementos>
<TimeStamp>2014-04-07T14:25:53.422+0200</TimeStamp>
<Estado>
<CodigoEstado>0302</CodigoEstado>
<LiteralError>Certificado caducado</LiteralError>
<TiempoEstimadoRespuesta>0</TiempoEstimadoRespuesta>
</Estado>
<CodigoCertificado>SDVSTCFWNS10</CodigoCertificado>
</Atributos>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
Application.properties
atlas.configurationcontext.multithread=false
Esta configuración queda relegada como la opción por defecto en caso de desactivar la generación de clientes
única, que se activa con la siguiente propiedad del mismo fichero:
87 de 106
Framework Atlas
Manual usuario de Servicios Web
Application.properties
#Modo de generación de clientes atlas de forma Unica
atlas.clientesunicos.activado=true
Por lo tanto, en caso de activar este nuevo parámetro (En versiones de atlas 1.3.0 y posteriores está activada por
defecto), la configuración de multiThread (Activado o desactivado) no tendrá efecto.
88 de 106
Framework Atlas
Manual usuario de Servicios Web
7. OBTENCION DE LO KEYSTORES
Los keystores (tanto los de pruebas como el de producción) se deben solicitar a la Unidad de Seguridad de
Sistemas que los generará e indicará una ruta de subversión donde se encuentra dicho keystore y una password
encriptada del keystore. (A esta ruta de subversión sólo tendrá acceso paso a producción)
En la ficha de Paso a Producción, en la casilla “Nombre del Keystore” hay que poner esta ruta para cada uno de los
entornos. Será paso a producción quien configure la variable https.keystore.path del fichero
environment.properties
(Recordar que cuando se pase ha producción habrá que indicar la ruta del entorno de pre-producción y del de
producción)
89 de 106
Framework Atlas
Manual usuario de Servicios Web
En la creación de un proyecto de servicio web, se crean tres módulos: el módulo web para generar un servicio web,
el módulo lib para la generación del cliente de dicho servicio web, y el módulo test que contiene proyectos de
SoapUI para realizar tests del servicio web sin utilizar el cliente Java del módulo lib.
En el proyecto de servicio web inicial, se incluyen ejemplos de proyectos sin seguridad, con seguridad https y con
seguridad de cifrado y firmado en el mensaje SOAP. A continuación se muestra como crear proyectos nuevos para
los servicios web a implementar.
En este caso, se importará el proyecto desde el WSDL del servicio web. Para ello, deberá ejecutarse primero el
servicio web con el comando:
Una vez arrancado el servidor Jetty, se accederá a la URL: http://localhost:9080/index.html para listar los servicios
disponibles. Pulsar con el botón derecho en el nombre del servicio y guardar el enlace con extensión .wsdl en el
módulo test, directorio src/main/resources/wsdl.
Una vez guardado el descriptor WSDL del servicio, abrir el programa SoapUI y generar un nuevo proyecto.
90 de 106
Framework Atlas
Manual usuario de Servicios Web
Antes de ejecutar operaciones, comprobar que la URL del servicio está correctamente configurada (puede faltar el
puerto).
91 de 106
Framework Atlas
Manual usuario de Servicios Web
Generar un proyecto nuevo siguiendo las instrucciones del apartado anterior. Como en el caso anterior, comprobar
que las URLs del servicio están correctamente configuradas con el protocolo HTTPS (y el puerto, que en jetty es
9443).
Hacer doble click en el nombre del proyecto para abrir sus propiedades. Pulsar en la pestaña „WS-Security
Configurations‟ y en la pestaña inferior „Keystores/Certificates‟. Pulsar el botón „+‟ y añadir el almacen client_ssl.jks
(o cualquier otro de que se disponga en el proyecto). Introducir la contraseña del almacén.
Una vez hecho esto solo es necesario asignar el almacén de certificados a cada petición y asegurarse que la URL
del servicio web es correcta:
92 de 106
Framework Atlas
Manual usuario de Servicios Web
Ya que la configuración de seguridad en este apartado es compleja, a continuación se muestran los pasos
necesarios para configurar un proyecto nuevo tomando como referencia el proyecto de EjemploServicioSeguro ya
existente.
Como en el caso del servicio sin seguridad, ha de guardarse a disco el descriptor WSDL del servicio seguro. A
continuación, cargar el proyecto de ejemplo EjemploServicioSeguro-soapui-project.xml en la carpeta
src/main/resources/soapui del módulo test.
93 de 106
Framework Atlas
Manual usuario de Servicios Web
94 de 106
Framework Atlas
Manual usuario de Servicios Web
A continuación, pulsar con el botón derecho en el nombre de proyecto y seleccionar la opción „Add WSDL’.
Seleccionar el fichero WSDL del proyecto guardado y asegurarse de marcar la opción „Create sample requests for
all operations?‟.
95 de 106
Framework Atlas
Manual usuario de Servicios Web
Por último, solo es necesario seleccionar la seguridad en cada operación del proyecto. Para ello, una vez abierta la
pantalla de la operación, pulsar en „Aut‟ y establecer los valores de Outgoing WSS e Incoming WSS.
96 de 106
Framework Atlas
Manual usuario de Servicios Web
Por último solo quedará ejecutar la operación para comprobar que la configuración es correcta.
97 de 106
Framework Atlas
Manual usuario de Servicios Web
En este apartado se mostrarán las modificaciones a la configuración de seguridad del proyecto SoapUI si se quiere
utilizar otro certificado de cliente. En el ejemplo mostrado a continuación se utilizará el fichero pf-5m.p12
descargado de la web de certificados de ICM.
Abrimos el proyecto SoapUI y hacemos doble click en el nombre para abrir las propiedades y tener acceso a la
configuración de seguridad.
98 de 106
Framework Atlas
Manual usuario de Servicios Web
Por último, en la pestaña „Outgoing WS-Security Configurations’, en cada una de las dos entradas
(politicaWSSFirmadoCifrado_salida y politicaWSSFirmadoCifradoSoap11_salida), en la pestaña „Signature’,
modificamos las entradas Keystore, Alias y Password con los datos del nuevo certificado cliente.
99 de 106
Framework Atlas
Manual usuario de Servicios Web
Con estos cambios, el certificado cliente que se utilizará en la seguridad corresponderá al fichero pf-5m.p12 usado
para el ejemplo.
Partiendo del proyecto del apartado anterior (7.1.4) simplemente habrá que añadir el almacén de certificados para
la conexión y configurarla en cada petición:
En primer lugar, se añadirá el nuevo almacén de certificados para la conexión HTTPS:
Haciendo doble click en el nombre del proyecto se abrirán las propiedades de este. En la pestaña „WS-Security
100 de 106
Framework Atlas
Manual usuario de Servicios Web
Después iremos añadiendo a cada petición el almacén de seguridad, asegurándonos que el endpoint del servicio
apunta a una dirección HTTPS:
101 de 106
Framework Atlas
Manual usuario de Servicios Web
Esta caso suele darse en el entorno de desarrollo. Consutar el apartado 3.1.6 de este documento para más
información. Muy probablemente, el error se deba a no haber modificado el fichero weblogic.xml para añadir la
sentencia <wls:show-archived-real-path-enabled>.
La solución más adecuada es añadir la línea en amarillo en el fichero weblogic.xml del proyecto:
Fichero web/src/main/webapp/WEB-INF/weblogic.xml
<wls:container-descriptor>
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
<wls:show-archived-real-path-enabled>true</wls:show-archived-real-path-enabled>
</wls:container-descriptor>
102 de 106
Framework Atlas
Manual usuario de Servicios Web
Se han detectado problemas de llamada en clientes Atlas de Axis2 que llaman a servicios web generados con Axis
1 en los que el error enviado por el servicio es:
consola
En el caso concreto de ser un servicio web de Axis1 al que se llama desde un cliente ATLAS realizado con Axis2 el
problema son los parámetros con valor null. Es necesario pasar en dichos parámetros un valor de cadena vacía „‟
para que la llamada no produzca error. El método de utilidad StringUtils.nullToBlank() toma una cadena String
9.3. Error al generar un cliente de Axis2 a partír del WSDL del servicio
consola
En este caso el WSDL del servicio ha sido generado con Axis1 en formato rpc/encoded, formato que no es
soportado por Axis2 ya que no es un estándar de servicios web. La única solución en este caso es generar el
cliente con el plugin maven de Atlas para Axis1.
103 de 106
Framework Atlas
Manual usuario de Servicios Web
9.4. Error al ejecutar Peticiones a Servicios Web Seguro desde entorno local
El error producido cuando se ejecuta una aplicación que realice peticiones a un servicio web seguro desde nuestro
entorno local es el siguiente:
consola
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid
certification path to requested target
Por favor, en caso de disponer de este error, revisad configuración de almacén de java, en el punto 4.3.0
Al realizar la llamada a un servicio web no seguro (a través de http), en ocasiones puede producirse el siguiente
error:
Consola
Este error se produce porque el servidor está configurado para utilizar solo el transporte https, para solucionarlo,
revisar que el fichero services.xml del servicio web (servidor) está incluyendo el transporte http además del https:
services.xml
<service name="nombreServicio">
…
…
…
<transports>
<transport>http</transport>
<transport>https</transport>
</transports>
9.6. Generación de TODAS las clases necesarias con WSDL2Code con Axis2
Al utilizar el plugin de maven Wsdl2code con Axis2 para la creación de un cliente de servicio web, es probable que
Axis2 no sea capaz de generar todas las interfaces necesarias para el correcto funcionamiento del cliente.
El error aparecerá al ejecutar la llamada al Servicio web, indicando que no reconoce un objeto del WSDL (un tipo
complejo).
Para evitar esto, y que axis genere todas las clases con el plugin (y no dinámicamente con la clase Stub), hay que
agregar los siguientes parámetros en el plugin de maven:
104 de 106
Framework Atlas
Manual usuario de Servicios Web
pom.xml
<plugin>
<groupId>atlasfrm</groupId>
<artifactId>atlasfrm-clientews-wsdl2code-maven-plugin</artifactId>
<version>${atlasfrm-clientews-wsdl2code-plugin.version}</version>
<configuration>
<packageName>atlas.ws.client</packageName>
<serviceNameAsPackage>true</serviceNameAsPackage>
<overWrite>false</overWrite>
</configuration>
<executions>
<execution>
<id>yyyyyService</id>
<configuration>
<generateServerSide>true</generateServerSide>
<generateAllClasses>true</generateAllClasses>
<wsdlFile>src/main/resources/wsdl/xxxx.wsdl</wsdlFile>
</configuration>
<goals>
<goal>wsdl2code</goal>
</goals>
</execution>
</executions>
</plugin>
105 de 106
Framework Atlas
Manual usuario de Servicios Web
ENLACES RELACIONADOS
Producto URL
Axis2 http://ws.apache.org/axis2/
106 de 106