Web Service Client x509

Hola, como estan ?

estoy tratando de armar un cliente web service wsdl, pero tengo que firmar el mensaje con un certificado x509.

Estoy usando netbeans 6.8 + Metro 2.0.

he buscado por la vuelta, y no he conseguido mucha información de como hacer esto.

Si alguien sabe como hacer esto, le agradezco mucho.

estoy abierto a cambiar de ide y/o stack.

gracias!

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

web server

Te pidieron firmar los mensajes como parte del protocolo del web service, o tienes que usar SSL? Si solamente te piden utilizar cifrado de datos con SSL te recomiendo que pongas el certificado (y llave privada) en el web service y te olvides del problema, a nivel aplicación.

Si lo que tienes que hacer es crear una firma digital y devolverla como un dato más en la respuesta de un web service entonces sí necesitas usar JCE. Revisa los paquetes javax.security y java.security pero primero lee algo de teoría acerca de PKI o criptografía de llave pública porque la bronca primero que nada la vas a tener con los conceptos; si no los manejas bien no vas a poder implementarlo bien.

firmar los mensajes

hola examudio, gracias por responder.

La idea es que los mensajes soap que envie estén firmados siguiendo el estandard de seguridad WS-Security
().

El tema es como hacer esto ... estoy usando Netbeans 6.8 con Metro 2.0, en la especificación del wsdl no trae especificación de seguridad.

Sabes como poner el certificado y la llave en la invocacion del web service ?

muchas gracias!

Imagen de ezamudio

Conceptos

Por eso te decía que primero tienes que entender bien los conceptos. Estás pidiendo algo que no te sirve de nada. No necesitas poner el certificado y la llave en la invocación del web service.

Desconozco el estándar WS-Security pero si está basado en PKI (y parece estarlo por lo que mencionas del X509), los mismos conceptos de siempre aplican.

Primero tienes que entender acerca de encripción de llave pública. Con una llave cifras dato, y con la otra los descifras. Una llave se llama pública porque se la das a todo mundo y la otra es privada porque te la quedas tú solamente. La llave privada generalmente se encripta usando algún algoritmo simétrico como AES.

Una firma digital de un mensaje consiste en sacar una digestión del mensaje (con MD5, SHA-1, SHA-256, etc) y encriptarla con la llave privada. Solamente el poseedor de la llave privada puede hacer eso y cualquiera que tenga la llave pública puede descifrar la digestión, regenerarla y compararlas; si son iguales es que el mensaje viene de quien dice venir y además no ha sido alterado.

Un certificado X509 es una llave pública con los datos del dueño de dicha llave, y viene firmado por otra entidad que también cuenta con un certificado (que a su vez puede estar firmado por otro certificado, es una cadena que termina en un certificado auto-firmado por una entidad que todo mundo está de acuerdo en que es reconocida y confiable, por ejemplo Verisign).

Un web service consiste en una invocación de un servicio, por medio del envío de un mensaje, y luego esperas una respuesta. Si tienes que firmar la petición entonces el invocador (el cliente del web service) debe tener una llave privada y un certificado; el certificado debe ser reconocido por el web service. El cliente genera su mensaje, lo firma, incluye dicha firma en el mensaje y lo envía. El web service verificará la firma y si es válida entonces procesará la petición.

Si la respuesta viene firmada, significa que el web service firma la respuesta e incluye dicha firma en la respuesta. El cliente debe verificar la firma y si es válida, aceptar la respuesta. Para ello, el cliente debe reconocer el certificado del web service.

Esto supongo que debe haber alguna manera de ponerlo encima del web service sin que tengas que programarlo a mano. El IDE que usas es irrelevante, lo que sirve saber es qué versión de Java usas y cómo creaste tu web service. Si fue con Metro entonces revisa la documentación de Metro a ver qué dice acerca de Ws-Security, tal vez solamente necesitas pasarle un keystore con los certificados y la llave privada. No mencionas si estás creando un web service o solamente invocándolo, o ambas.

ws client

gracias nuevamente,

entiendo el concepto,
lo que estoy tratando de armar es un cliente.

lo que no puedo es firmar la petición, se entiende ?

tengo la llave y el ceritifacado ...

(El ide te puede dar una mano a firmar la petición, que en este caso a no estar definida la politica de seguridad en el wsdl, el ide interpreta que no es necesario, y no me da las opciones de config. )

ezamudio

como andas?

sigo luchando con esto ... logre llevar mi private key con el csr y el ca root a un key store. Luego me arme con soapui un cliente, me importe el keystore.
Le configure que firmara la salida y me anduvo.

Ahora, sabes como puedo hacer para hacerlo desde codigo Java ?

muchas gracias

Imagen de ezamudio

Framework...

Pues depende del framework que utilices... si es un cliente de web service hecho con las nuevas facilidades que trae Java 6, o usas Apache CXF, o Axis, o los de Spring, etc... Yo por lo general uso Axis o los de Java 6; El de Java 6 es muy planito no te deja configurarle nada. Axis seguramente te permitirá moverle a ese tipo de parámetros pero nunca he tenido que hacer algo así, la verdad no sabría decirte.

grax

muchas gracias,
posteare la solucion cuando la sepa,
saludos

hola, estoy haciendo lo miso,

hola, estoy haciendo lo miso, al final encontraron la solucion, porfavor seria de mucha ayuda

Imagen de edgar.martinez

Articulo en la Java Magazine

Hola, quiza este articulo en la Java Magazine les pueda ser útil, los va llevando paso a paso y provee código de ejemplo:

o

En la tercera y ultima entrega de este articulo se implementa el certificado X.509:

Muy completa serie, son tres articulos a mucho detalle.

Saludos