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):
1 2 3 4 5 6 7 8 9 10 |
<!-- 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:
Si le decimos examinar certificado, veremos la información
que rellenamos previamente al generarlo:
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):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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):
1 2 3 4 5 6 7 8 9 |
<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
INVOQUEMOS EL WEBSERVICE DESDE
UN CLIENTE:
Nos creamos la clase
cliente, y la invocaremos desde su método main:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
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:
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
Ahora pulsamos en Ver
certificado, pestaña detalles:
Pulsamos
sobre Copiar en Archivo:
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:
> 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.
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
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