lunes, octubre 01, 2007

Creación de un webservice seguro mediante ssl

En mi curso de sistemas distribuidos tuve que explicar a mis compañeros como implementar un

webservice seguro. A pesar de unos imprevistos, gracias a Dios todo salio bien. Ahora que ya realicé la exposición, dejo a disposición del mundo cómo logre realizar un webservice
común y corriente, pero seguro gracias a la transmisión mediante la capa de socket seguro SSL.


Las herramientas utilizadas fueron las siguientes:


El primer paso, que no mencioné en la presentación fue la instalación del software. Para ello basta realizar

pacman -Sy jdk tomcat netbeans

así como descargar axis2. Yo opté por descargar el war. El que luego lo dejé en el directorio webapps de tomcat. Además, bajé la versión normal, sólo para tener acceso a los programas, pues es necesario uno en particular, tal como se verá mas adelante. La instalación de estos softwares es básica, por lo que no lo abordaré.


Luego de la instalación de las herramientas es la configuración de éstas. Tomcat se distribuye por defecto con la opción de ssl deshabilitada, por lo primero se explicará como habilitar ésta.


Creación de un certificado

La capa de socket seguro utiliza certificados para encriptar la información. Por lo que es necesario la creación de uno. Para lograrlo se utiliza la herramienta keytool, proveída junto con el sdk de java.


Su uso es simple, pues se debe indicar el archivo donde se almacenará el certificado. Ésto se realiza con el parámetro keystore. Además de esto, se deben indicar 4 parámetros adicionales que se enumeran a continuación:


El primer parámetro, llamado alias, indica el nombre que recibirá el certificado. Es importante que corresponda al nombre del host que proporcionará el web service.


Keypass y storepass indican la clave que se le asigna al certificado, en ambos parámetros las
contraseñas deben coincidir. Keytool exije que la contraseña tenga una longitud superior a 6 caracteres.


Keyalg indica el algoritmo de creación de la clave, se recomienda el uso de RSA, algoritmo que funciona mediante el sistema de clave pública y privada.


Un ejemplo de utilización es el siguiente.


keytool -genkey -alias localhost -keypass password -keystore /opt/tomcat/webapps/localhost.bin -storepass password -keyalg RSA


Habilitación de SSL

Para habilitar en el servidor Tomcat la conexión segura, basta descomentar la sección que
empieza con la etiqueta connector port=”8443”. Esta sección indica las directivas de como utilizar la seguridad SSL.


Es necesario indicarle cual es la llave que debe utilizar, así como la contraseña del certificado, y finalmente el alias de éste.


<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true" acceptCount="100"

scheme="https" secure="true" clientAuth="false" sslProtocol="TLS"

keystoreFile="/home/tomcat/localhost.bin"

keystorePass="password" keyAlias="localhost" />


Al terminar de configurar esto, basta reiniciar el servicio tomcat para visualizar los datos. Se puede comprobar intentando conectarse al servidor mediante el protocolo https, y el puerto 8443.



Configuración de la aplicación

Cuando se habilita la seguridad en el servidor, esta permite acceder a las aplicaciones tanto de modo seguro como inseguro. Pero se busca que el servicio web funcione solamente mediante el primero. Para lograr que la aplicación encargada éste trabaje sólamente como SSL, en el caso
de tomcat hay que indicarselo en el archivo de configuración web.xml, el cual se encuentra en el directorio WEB-INF de la aplicación.


Para asegurar la aplicación, basta agregar el siguiente código dentro de la sección “web-app”


<security-constraint>

<web-resource-collection>

<web-resource-name>securedapp</web-resource-name>

<url-pattern>/*</url-pattern>

</web-resource-collection>

<user-data-constraint>

<transport-guarantee>CONFIDENTIAL</transport-guarantee>

</user-data-constraint>

</security-constraint>


Para que la aplicación utilice los cambios es necesario reiniciarla desde la interfaz de
administración de tomcat, o bien reiniciando este último. Así, el acceso a la aplicación que provea los webservice será exclusivamente mediante el protocolo de seguridad.


Creación del webservice

Para programar el servicio web se utilizó el framework axis2, el cual implementa el protocolo SOAP de acuerdo a lo especificado por la W3C. La gran ventaja de este framework es la facilidad para lograr esto, pues basta con programar clases jav comunes y corrientes tal como se verá a continuación.


El proceso empieza con la definición de una interfaz, la que se denominará contrato. En ella se
indicará cuales serán los servicios web disponibles.


Como ejemplo se utilizará la interfaz Matematica, la que define un método llamado
sumar, el cual posee dos parámetros de tipo entero.

package ejemplo;

public interface Matematica {

public int sumar(int a, int b);

}


Una vez definido el contrato, el siguiente paso es compilar la clase, y luego crear un archivo de
descripción del lenguaje, en adelante wsdl, el cual se crea mediante la utilidad proveída por axis2 mediante el siguiente comando:


java2wsdl.sh -cn ejemplo.Matematica


Éste comando crea un archivo llamado Matematica.wsdl, el cual se utilizará mas
adelante.


Así como axis nos puede funcionar sin tomcat, una interfaz es inutil sin una implementación.
Motivo por el cual es necesario realizar esta. Para ello se creó el archivo servicioMatematica.java, clase que se expone a continuación.


package ejemplo;


public class servicioMatematica implements Matematica{

public int sumar(int a, int b){

return a + b;}


}


Una vez compilada la implementación, sólo falta definir los servicios. Para realizar dicha
definición se crea un archivo llamado services.xml. En éste es necesario indicar el nombre de los servicios proporcionados por la clase, así como la clase que implementa de esta.


<?xml version="1.0"
encoding="UTF-8"?>

<service>

<description>

Servicio de ejemplo

</description>

<parameter
name="ServiceClass" >ejemplo.servicioMatematica</parameter>

<operation name="sumar">

<messageReceiver
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>

</operation>

</service>

Con esos cuatro archivos creados se está en condiciones de crear el webservice. Para que axis2 reconozca estos, es necesario crear un paquete jar, con la extensión cambiada por aar.


Para crear dicho paquete es necesario definir una estructura de archivos bastante simple. En ella debe existir un directorio META-INF que contenga los archivos xml. Y en la base se debe agregar las clases que componen el servicio web, respetando la jerarquía de paquetes.


El comando para crear dicho archivo se explica a continuación:


jar -cvf ejemplo.aar -C ejemplo.aar/ .


Donde los parámetros cvf indican que debe crear el paquete jar, y C define el directorio a agregar.


Para cargar el servicio web, en la interfaz de administración de axis2 existe una opción llamada “upload service”, la que permite instalar el web service de una manera sencilla. Cable señalar que para un correcto funcionamiento de esta, dentro del directorio de aplicaciones de tomcat debe existir uno llamado axis2/WEB-INF/services, lugar que debe tener permisos de escritura


Para verificar que todo ha funcionado, la dirección donde se debiera encontrar el lenguaje de
definición del servicio es la siguiente:


https://localhost:8443/axis2/services/ejemplo?wsdl

Donde localhost debe ser la dirección del servidor, y axis2 es el nombre del directorio que contiene el framework.


Consumo del web service utilizando netbeans

El entorno integrado de desarrollo proveído por sun, netbeans provee herramientas que simplican el consumo de los webservice.

Para utilizarlas, basta con agregar al proyecto un cliente webservice, e indicar como dirección del
wsdl la ruta del servicio seguro indicada anteriormente. Así netbeans interpreta la definición del webservice, y genera las referencias, que para usarlas deben ser arrastradas hacia el código.


Como se está utilizando un socket seguro, es necesario utilizar las definiciones terminadas en https.


Certificados para el cliente

Al utilizar certificados se tiene un gran inconveniente. Este problema nace debido al requerimiento de aceptar un certificado, único método para asegurar la validez de éste.


Java utiliza SSL, pero los certificados deben ser validados por una entidad certificadora. Para efectos del proyecto los certificados usados no están validados, motivo por el cual al intentar ejecutar el cliente arrojará una excepción. Para poder utilizar los certificados de prueba generados con keytool, es necesario agregarlos manualmente, para ello se utiliza la herramienta proveía por Andreas Sterbenz en su página personal


El uso es simple, basta ejecutar el programa con el comando

java InstallCert localhost:8443


Una vez creado el certificado, basta copiar jssecacerts al directorio /opt/java/jre/lib/security/. Luego, las aplicaciones reconocerán el certificado de prueba y
por lo tanto podrán usar el servicio web por ssl.


No hay comentarios.:

Publicar un comentario

Su comentario es bienvenido y agradecido