Creación e invocación de Webservices por SSL

1
63462

CREACIÓN E INVOCACIÓN DE WEBSERVICES POR SSL

Los ejemplos de este tutorial están hechos con el siguiente entorno de desarrollo:

  • Jboss Eclipse
    IDE Milestone 5.

  • JDK 1.4
  • JBoss 4.0.4 GA

  • Axis 1.3


En
este
tutorial se pretende enseñar al lector, (si aún
no lo
sabe), a desplegar un webservice usando SSL y a invocarlo
correctamente. Se presupone que el lector ya sabe instalar axis, crear
un webservice y desplegarlo en axis, generar un certificado
autofirmado, importar y exportar el certificado e instalarlo en
JBoss .  Si no es así, hay varios
tutoriales en
adictosaltrabajo.com
que explican como realizarlo. No obstante, durante
el
desarrollo del tutorial se mostrará como realizarlo sin
entrar
en detalle.

GENERACIÓN DEL
CERTIFICADO.


Lo
primero que hemos de hacer para trabajar con SSL es generarnos un
certificado con su par de claves.

Lo haremos con la herramienta keytool de la JDK 1.4.

> keytool
-v -genkey -alias PACO_PAIR
-keystore AUTENTIA_KEYS.ssl

Rellenad la información
que os pide (no os olvideis de la contraseña)

Generamos un par que llamamos PACO_PAIR y la almacenamos en
el fichero AUTENTIA_KEYS.ssl.

INSTALACIÓN DEL
CERTIFICADO.


Una
vez generado el certificado, lo «instalaremos» en JBoss. Para ello,
copiaremos el fichero que acabamos de generar (AUTENTIA_KEYS.ssl) a la
ruta de JBoss:  

 <INSTALACION_JBOSS>\server\default\conf

Vamos
a configurar el JBoss para que abra el puerto SSL e indicarle el
almacén de certificados que queremos usar:

Editamos el fichero:

 <INSTALACION_JBOSS>\server\default\deploy\jbossweb-tomcat55.sar\server.xml

Buscad la siguiente entrada y modificar los
siguiente (no olvidéis descomentarla):

<!-- SSL/TLS Connector configuration using the admin devl guide keystore -->

<Connector port="8443" 
    address="${jboss.bind.address}"
    maxThreads="100" strategy="ms" maxHttpHeaderSize="8192"
    emptySessionPath="true"
    scheme="https" secure="true" clientAuth="false" 
    keystoreFile="${jboss.server.home.dir}/conf/AUTENTIA_KEYS.ssl"
    keyAlias="PACO_PAIR"  keystorePass="autentia" sslProtocol = "TLS"
/>

Le hemos «dicho» a
JBoss (a tomcat en realidad) que queremos usar el puerto 8443 para
comunicación SSL, usando el par de claves PACO_PAIR
almacenado
en AUTENTIA_KEYS.ssl, usando autentia como password para abrir el
almacén.


Si
arrancamos ahora JBoss, podemos comprobar el resultado arrancando algun
navegador y conectándonos al servidor:
   
    http://localhost:8443

Al
ser un certificado autofirmado, nos muestra el siguiente mensaje:

Mensaje informativo certificado


Si le decimos examinar certificado, veremos la información
que rellenamos previamente al generarlo:

Detalle certificado

CREAMOS Y DESPLEGAMOS EL
WEBSERVICE EN AXIS.

Nos creamos un interfaz donde definir los métodos
del
webservice. Nosotros, para hacerlo fácil y
rápido,
crearemos una clase Calculadora y le crearemos el
método
suma (un tanto típico):


package com.autentia.tutoriales.ws;

import java.rmi.RemoteException;

public class Calculadora {

public int suma(int sum1, int sum2) throws RemoteException {

    return sum1 + sum2;

}

Nos generamos su descriptor de despliegue (deployCalcu.wsdd):

<deployment
    xmlns="http://xml.apache.org/axis/wsdd/"  
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 
     
    <service name="Calculadora" provider="java:RPC">
        <parameter name="className" value="com.autentia.tutoriales.ws.Calculadora"/>       
        <parameter name="allowedMethods" value="*"/>    
    </service>
</deployment>

Desplegamos el servicio:

java
org.apache.axis.client.AdminClient deployCalcu.wsdd

No olvidéis copiar la clase compilada en
(Calculadora.class) en:

 <INSTALACION_JBOSS>\server\default\deploy\webapps\axis.war\
    WEB-INF\classes


Recordad
que debéis copiar la ruta completa: com/autentia/....

Vamos a comprobar que está desplegado:

https://localhost:8443/axis/services/Calculadora?wsdl


 WSDL Ws desplegadi

INVOQUEMOS EL WEBSERVICE DESDE
UN CLIENTE:

Nos creamos la clase
cliente, y la invocaremos desde su método main:

package com.autentia.tutoriales.ws;

import org.h2.command.dml.Call;

public class ClienteWsCalcu {

    public static void main(String[] args) {
        final Service service = new Service();
        Call call = null;
        try {

            call = (Call)service.createCall();

            final String endpoint = "https://localhost:8443/axis/services/Calculadora";

            call.setTargetEndpointAddress(new java.net.URL(endpoint));

            final Object[] datos = new Object[2];

            datos[0] = new Integer(1);

            datos[1] = new Integer(2);

            final Integer res = (Integer)call.invoke("suma", datos);

            System.out.println("RESULTADO (DEBERIA DAR 3):" + res.toString());
        } catch (final Exception e) {

            // TODO Auto-generated catch block

            e.printStackTrace();
        }

    }
}

Si
ejecutamos el método main, veréis lo que ocurre:

Excepcion

Obtenemos una excepción de seguridad: "No trusted certicate found"

Es decir, se nos está diciendo que el certificado
con el que
estamos tratando no es de confianza. ¿Cómo lo
resolvemos
?. Pues haciéndolo de confianza. Para ello, debemos importar
el
certificado en nuestro almacén de certificados de confianza:

Lo primero que haremos es importar el certificado. Vamos
primero a
obtenerlo (podríamos exportarlo del fichero de claves
inicial
pero lo vamos a hacer de otra manera)

Abrimos internet explorer: https://localhost:8443

Ver certificado

Ahora pulsamos en Ver
certificado, pestaña detalles:

Detalles

Pulsamos
sobre Copiar en Archivo:

Formato certificado

Seleccionamos
DER binario codificado X.509 y guardamos el
fichero en
algún lugar del disco. Yo le he llamado:
CLAVES_PACO_CLIENTE.cer

Vamos ahora a importarlo ahora al almacén de
certificados de confianza:

Copiamos el fichero CLAVES_PACO_CLIENTE.cer
a
la ruta:
   
<RUTA_JDK>\jre\lib\security

Vamos a importar el certificado al fichero cacerts:

Importamos certificado

> keytool -v -import -file CLAVES_PACO_CLIENTE.cer -keystore
cacerts

La contraseña por defecto del almacén
de certificados de confianza de la JRE es "changeit"

Cuando pregunte:   ¿Confiar en
este certificado? : contesta: si

Ahora,
si ejecutáis el código anterior
debería funcionar.

Ejecución correcta

Si aún no os funciona, probar a
indicarle donde
está el
almacén de certificados de confianza en el arranque de la
máquina virtual:

java
....  -Djavax.net.ssl.trustStore=<RUTA_COMPLETA_FICHERO_ALMACEN>

(fichero cacerts)

Bueno, ya está todo.

Si necesitáis ayuda, ya sabéis donde
encontrarnos: http://www.autentia.com


1 COMENTARIO

  1. Que tal? Necesito generar el certificado para varios clientes android que van a consumir el servicio. Mi duda es en emitido para, no puedo poner todos los celulares porque seria una locura a parte estarían todos en diferentes lugares ya que invocarian el servicio a través de Internet y no estarían todos en una misma red lan.

    Como puedo hacer en ese caso?
    Gracias

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad