Web Service con firma digital FRAMEWORK JAVA 2.1 CREACIÓN DE WEBSERVICES Versión 1.1 MARZO 2007 Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 1 Web Service con firma digital FRAMEWORK JAVA 2.1 1 TABLA DE CONTENIDO 1 TABLA DE CONTENIDO............................................................................ 2 2 INTRODUCCIÓN ........................................................................................ 3 3 HERRAMIENTA DE DESARROLLO ANT ................................................. 3 4 CREACION SERVICIO WEB...................................................................... 3 5 CREACIÓN CLIENTE WEB ....................................................................... 5 6 PROBLEMAS DETECTADOS.................................................................... 5 7 FICHEROS EJEMPLO................................................................................ 6 Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 2 Web Service con firma digital FRAMEWORK JAVA 2.1 2 INTRODUCCIÓN Este documento indica como construir servicios web y clientes para dichos servicios firmando el mensaje de petición y de respuesta utilizando el estándar XML-Dsig. Para esta firma y la validación de la misma se utilizará la plataforma ASF, debiendo cumplir el servicio y el cliente todos los pasos necesarios para estar de alta en la misma, como se explica en el manual de la misma. 3 HERRAMIENTA DE DESARROLLO ANT Primeramente y antes de seguir adelante indicar que como herramienta de desarrollo de tanto los WebServices como los clientes de los mismos, se decido utilizar Ant. Un proyecto de código abierto de Apache Software Fondation. Ant es una herramienta desarrollada para sustituir al make que podríamos hacer en cualquier sistema operativo, pero que depende de plataforma ya que esta hecha en Java y sus ficheros de configuración se basan en XML. Su uso y funcionamiento se puede asemejar a los ficheros bat, shell o script de otros sistemas operativos. Dentro de un fichero de configuración de ANT, como puede ser el fichero build.xml que veremos más adelante, cada una de las tareas que se deben realizar se denomina target. Además se pueden establecer variables que podrá ser accesibles por cualquier tarea, a través de la marca property. De todas formas podemos encontrar una relación del significado de cada una de las marcas y sus parámetros dentro de la página http://ant.apache.org. 4 CREACION SERVICIO WEB Pasos a seguir para la creación de un Servicio Web: 1. Descargar la versión 1.2.1 de axis de la dirección http://archive.apache.org/dist/ws/axis/1_2_1/axis-bin-1_2_1.zip. 2. Descomprimir el zip de axis en cualquier directorio. A partir de ahora esa ruta será la variable "axis.home". 3. Copiar el contenido del directorio webapps/axis del directorio axis.home a nuestro directorio web del servicio que estemos creando. Eliminando el directorio ‘samples’ que se encuentra dentro de él, ya que no es necesario. Al concluir este paso tendremos incluido dentro de nuestro Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 3 Web Service con firma digital FRAMEWORK JAVA 2.1 directorio ‘WEB-INF’, las clases y librerías necesarias para empezar con nuestro servicio web. 4. Hay que crear un fichero usando ANT, como el fichero build.xml de ejemplo (el que viene al final de este apartado o dentro de los ejemplos disponibles dentro de soja_int (ASF->Ejemplos)). Este fichero hay que modificarlo cambiando el nombre del proyecto y las variables que afecten a las rutas físicas de nuestro proyecto. 5. Crear la clase que hará de servicio web, para ello heredar de la clase de sistemas: sistemas.ws.ServicioWeb. Usar el constructor de esta clase para indicar el nombre del fichero de configuración y que recoja las variables del mismo. Además en esta clase se definirán las operaciones a las que va a dar servicio nuestro WebServices. 6. Luego hay que modificar el fichero anterior eliminando el elemento target llamado autentication-java2wsdl, sustituyendolo por uno propio de nuestro servicio y que ejecuta la tarea "axis-java2wsdl" que genera el WebService, empaquetando las clases generadas dentro del paquete indicado. Además de estas clases se crea un fichero descriptor de nuestro servicio web con extensión wdsl y nombre el que nosotros le indiquemos. Es recomendable que si va a haber varios webservices se cree una tarea para cada servicio. Se puede tomar el ejemplo "autentication-java2wsdl" como guía de creación de esta tarea. 7. Acontinuación crear el fichero deploy.wsdd, del cual se puede ver un ejemplo al final de este punto, ajustandolo con el nombre de la clase del servicio web y el nombre del mismo. En nuestro caso, el servicio es UsuJAutenticationWS y la clase es usuj.ws.UsuJAutenticationWS. 8. Realizar un primer despliegue del servicio en un servidor de aplicaciones usando para ello la tarea deploy que esta incluida en el fichero build.xml. La tarea deploy solo crea el ear a partir de la web y copia el fichero en el directorio "deploy.dest". Para el primer despliegue tal vez sea necesario modificar algún fichero de configuración del servidor de aplicaciones para que reconozca la aplicación (server.xml y http-web-site.xml). 9. Ejecutar la tarea deploy-wsdl para realizar el despliegue inicial del WebService en Axis, es decir, para realizar la publicación dentro Axis del servicio web. 10. Copiar el fichero server-config.wsdd del directorio WEB-INF de la aplicación desplegada al de nuestro proyecto de desarrollo. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 4 Web Service con firma digital FRAMEWORK JAVA 2.1 Obs: Para comprobar que nuestro servicio se encuentra dado de alta y responde a peticiones, puede hacerse una petición a la dirección correspondiente a nuestro servicio y siguiendo la estructura: http://servidor:puerto/aplicación/services/ClaseServicio Esta petición nos debe responder un mensaje de AXIS para saber que esta funcionando correctamente. 5 CREACIÓN CLIENTE WEB Una vez creado nuestro webservice, es hora de crear el cliente. Este punto también se puede seguir en el caso de que no hayamos creado nosotros el servicio, ya que lo únicamente necesario es el fichero wsdl que describe las operaciones del mismo. Una vez con el fichero comentado, que siguiendo nuestro caso se obtendría en el paso 6. Se debería definir tarea "axis-wsdl2java" de Ant, de la que podemos ver un ejemplo en "autentication-wsdl2java". Esta tarea nos creara todas las clases necesarias para invocar el webservice asi como una clase de test que nos permitirá testear el cliente generado en caso de ser necesario. Para poder ejecutar esta clase de test será necesario tener dentro de nuestro proyecto de Eclipse importado el jar de junit. 6 PROBLEMAS DETECTADOS Se han detectado los siguientes problemas en este proceso de creación de cliente y servicio web: - La generación de los paquetes no es todo lo correcta que deberia ser. Al generar el webservice le indicamos un namespace que luego añade al paquete que indiquemos en la generación del cliente, por lo que habra que tenerlo en cuenta. - La variable "service_address" dentro de la clase Locator es incorrecta, le falta añadir el nombre del servicio que se va a usar al final. - El test que crea para recibir el wsdl no funciona nunca a pesar de que los demas si funcionan y de que el servicio devuelve correctamente el WSDL si se le invoca a traves de un explorador. -En OC4J podemos tener problemas para generar el wsdl puesto que el parser que emplea no es del todo estandar para solucionarlo existe un parche para el parser de oracle. Enviar un correo a Arquitectura e Integración de aplicaciones para recibir este parche. Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 5 Web Service con firma digital FRAMEWORK JAVA 2.1 7 FICHEROS EJEMPLO Ejemplo de build.xml: <project name="usuj_ws"> <property name="appname" value="${ant.project.name}" /> <property name="src.dir" value="java/fuentes/src"/> <property name="web.dir" value="java/fuentes/web"/> <property name="build.dir" value="java/fuentes/web/WEB-INF"/> <property name="deploy.dir" value="java/ear"/> <property name="axis.home" value="D:/descargas/axis-bin-1_2_1/axis-1_2_1"/> <property name="deploy.dest" value="D:/Producto/oracle9.0.4/j2ee/home8052/icm"/> <property name="target.port" value="8052"/> <property name="target.server" value="pc317668"/> <property name="target.appname" value="${appname}"/> <property name="endpoint-stub.wsdd" value="java/fuentes/web/WEB-INF/deploy.wsdd"/> <path id="axis.classpath"> <fileset dir="${axis.home}/lib"> <include name="**/*.jar"/> </fileset> <fileset dir="${build.dir}/lib"> <include name="**/*.jar"/> </fileset> <fileset dir="${build.dir}/classes"> <include name="**/*.class"/> </fileset> </path> <taskdef resource="axis-tasks.properties" classpathref="axis.classpath" /> <target name="autentication-java2wsdl" description="Crea el WSDL de la clase especificada"> <axis-java2wsdl classname="usuj.ws.UsuJAutenticationWS" namespace="usuj.ws.autentication" location="http://${target.server}:${target.port}/${appname}/services" classpath="${build.dir}/classes" output="${build.dir}/UsuJAutenticationWS.wsdl"> <mapping namespace="urn:UsuJAutenticationWS" package="usujWs.servicio"/> <classpath path="${build.dir}"/> </axis-java2wsdl> </target> <target name="autentication-wsdl2java" description="Crea las clases necesarias para invocar un webservice, es decir, el cliente del servicio"> <axis-wsdl2java output="${src.dir}" testcase="true" verbose="true" url="${build.dir}/UsuJAutenticationWS.wsdl"> <mapping namespace="http://axis.apache.org/ns/interop" package="usujWs.servicio"/> </axis-wsdl2java> </target> <target name="compile" description="Compile main source tree java files"> <mkdir dir="${build.dir}/classes"/> <javac destdir="${build.dir}/classes" debug="true" optimize="false" deprecation="false" failonerror="true"> <src path="${src.dir}"/> <classpath> <path refid="compile.classpath"/> <fileset dir="${web.dir}/WEB-INF/lib" includes="*.jar"/> </classpath> </javac> </target> Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 6 Web Service con firma digital FRAMEWORK JAVA 2.1 <target name="deploy" description="Crea el .ear de la aplicación y lo deja en el directorio ear"> <war destfile="${deploy.dir}/${appname}.war" webxml="${build.dir}/web.xml"> <fileset dir="${web.dir}"/> </war> <ear destfile="${deploy.dir}/${appname}.ear" appxml="${deploy.dir}/METAINF/application.xml"> <fileset dir="${deploy.dir}" includes="*.war"/> </ear> <delete> <fileset dir="${deploy.dir}" includes="**/*.war"/> </delete> <copy file="${deploy.dir}/${appname}.ear" todir="${deploy.dest}"/> </target> <target name="deploy-wsdl" description="Realiza el despliegue inicial del WebService en Axis"> <axis-admin port="${target.port}" hostname="${target.server}" failonerror="true" servletpath="${target.appname}/services/AdminService" debug="true" xmlfile="${endpoint-stub.wsdd}"/> </target> /project> Ejemplo de deploy.wsdd: <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="UsuJAutenticationWS" provider="java:RPC"> <parameter name="className" value="usuj.ws.UsuJAutenticationWS"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> Área de Integración y Arquitectura de Aplicaciones Dirección de Análisis y Mantenimiento de Aplicaciones y Desarrollos Institucionales Subdirección General de Desarrollo, Tecnología e Infraestructuras Página: 7