*********Esto encontrarás en este Tutorial*********
1.Creación del certificado digital
2.Creación de servicio web asegurado con X509
3.Seguridad al Oracle App server
4.Creación de cliente que consume WS con X509
5.Cifrado en un solo campo del mensaje
LO REQUERIDO:
El otro día me pidieron que asegurara la comunicación a través de X509 de mensajes WS
Y además que cifrara solamente una porción o campo del mensaje XML
Entonces para que no le busquen más, aquí esta
************CERTIFICADOS DIGITALES************
Primero debemos crear el almacén de claves, y el certificado del server y del cliente, además dar de alta sus llaves privadas y públicas
Para hacerlo dentro del Java Home, en mi caso es: D:\oracle\soasuite\jdk\bin> esta el Java KeyTool.
Primero generamos la FIRMA del Servidor / SERVER SIGN KEY
En este se especifica el DN, el algoritmo con el que se cifrará, el archivo donde se almacenarán las claves, y el alias del server sign key
keytool.exe -genkey -dname "CN=Server,C=MX" -keyalg RSA -sigalg Sha1WithRSA -keystore D:\testers\servidor.jks -alias serversign
Después necesitamos la llave de encripción del server / SERVER ENCRYPT KEY
keytool.exe -genkey -dname "CN=Server,C=MX" -keyalg RSA -sigalg Sha1WithRSA -keystore D:\testers\servidor.jks -alias serverenc
Ahora necesitamos generar la firma del Cliente en un nuevo almacén
keytool.exe -genkey -dname "CN=Cliente,C=MX" -keyalg RSA -sigalg Sha1WithRSA -keystore D:\testers\cliente.jks -alias cliente
Copiamos las llaves publicas del servidor al cliente y del cliente al servidor
Para exportar la llave de encripcion del servidor:
keytool.exe -export -keystore D:\testers\servidor.jks -storepass [PASSWORD] -alias serverenc -keypass [PASSWORD] -file D:\testers\serverencPublico.cer
Importar la llave de encripción del servidor en el almacén de claves del cliente
keytool.exe -import -keystore D:\testers\cliente.jks -storepass [PASSWORD] -alias serverenc -file D:\testers\serverencPublico.cer
Exportar el certificado del cliente e importarlo en el almacén del servidor
keytool.exe -export -keystore D:\testers\cliente.jks -storepass [PASSWORD] -alias cliente -keypass [PASSWORD] -file D:\testers\clientePublico.cer
keytool.exe -import -keystore D:\testers\servidor.jks -storepass [PASSWORD] -alias cliente -file D:\testers\clientePublico.cer
Para revisar el contenido de las llaves importadas y generadas se puede ejecutar lo que sigue:
keytool.exe -list -v -keystore D:\testers\servidor.jks
keytool.exe -list -v -keystore D:\testers\cliente.jks
*********JDEVELOPER WS CON X509************
Vamos al Jdeveloper y generaremos una aplicación Java que después convertimos en web service.
Genera una aplicación java que reciba al menos dos campos, para cifrar primero todo el mensaje, y finalmente cifrar solo uno de los campos.
Ya que tenemos la clase que deseamos convertir en WS, hacemos lo siguiente:
Botón derecho sobre el proyecto y seleccionamos New
Y seleccionamos Web service / Java web service
El Nombre del servicio, y la clase a publicar:
Document Wrapped ya que recibe más de un elemento:
Next hasta llegar a los métodos. Seleccionamos los métodos a convertir en WS.
Dar clic en Next hasta llegar al final, y Finish.
Ya tenemos el WS. Agregaremos la seguridad con X509.
Botón derecho sobre el WS>Secure Web Service
Especificamos lo que sigue:
En autenticación:
Ojo: asegurarse de que si seleccionan tanto el "paquete" (ServerBlogX509... en mi caso), como el método (Prueba509... en mi caso), tengan las mismas opciones seleccionadas.
Inbound, seleccionar también Creation Time Required...
En OutBound el mismo caso:
En KeyStore Options:
En Inbound confidentiality:
En Outbound confidentiality:
¡Listo!, dar clic en Aceptar.
Ya lo podemos publicar, nos genera dos deployments, utilizamos el de KeyStore, el cual publica también el certificado.
Pueden mirar el archivo: oracle-webservices.xml Ahí se pueden dar de alta los passwords del keystore o almacén. Pero eso lo daremos de alta en el servidor de aplicaciones.
Publicamos con Botón derecho en KeyStore.deploy y seleccionar el oc4j en donde se publicará:
*********CONFIGURACION DE SEGURIDAD EN ORACLE APPLICATION SERVER - WS***********************
Ya que esta publicado debemos configurar la seguridad en el servidor de aplicaciones
Entramos a la consola de Oracle App Server>el contenedor del WS > y seleccionamos la aplicación que contiene el WS
Damos clic en el tab de web services y seleccionamos el WS.
Vamos al tab de administración:
Y damos click en seguridad:
Damos clic en keystore and identity certificates, y agregamos en la siguiente pantalla los datos.
Nos dice que los cambios se guardaron.
Por ultimo agregamos al usuario en el Jazn o en el LDAP. ¿Qué usuario? Pues el que dimos de alta con la instrucción:
keytool.exe -genkey -dname "CN=Cliente,C=MX" ...
Debemos crear al usuario Cliente
Vamos al enterprise manager, y damos clic a la aplicación que contiene el WS.
En mi caso es el de BlogSeguridad... etc
Y en vez de ir a la liga del web service, damos click en administración,
Security Provider
El tab de Realms> y en la liga de users
Damos clic en el botón de create
Y definimos el usuario Cliente con el password que se agrego desde el principio.
Listo, eso es todo en esta parte.
******JDEVELOPER CREAR PROXY WS (CLIENTE)******
Ahora vamos a generar el cliente que consume el web service asegurado:
En Jdeveloper botón derecho sobre el workspace, y dar clic en new project > proyecto vacío > nombre del proyecto (en mi caso: X509)
Botón derecho sobre el proyecto > new. Y seleccionar en web services > web service proxy
Agregamos en la pantalla el WSDL del servicio
Le mencionamos que lo ejecute contra el server:
Dar clic en terminar después de especificar esto, se genera el proxy del web service o cliente.
Damos clic en el proxy, y damos botón derecho, y seleccionamos secure proxy
Seleccionamos lo siguiente en las pantallas:
Listo, queda asegurado el cliente. Solo faltan algunos pasos.
Seleccionan el proxy, y en la parte de estructura dar doble clic en el archivo [NombreDelWS]SoapHTTP_Stub.xml
Poner el cursor sobre el texto del archivo que se abrió.
Y en el panel de estructura doble clic en key-Store
Agregar los datos:
Lo mismo en signature y encryption key:
Una vez que ya este, dar click derecho en el proyecto y seleccionar rebuild
Agregar en el archivo que invoca al servicio, el código para mandar llamar el método del servicio, aquí esta el mío seleccionado.
Y Ejecutarlo, pueden ir al menú>View> http analyzer para ver lo que manda el proxy y lo que le contesta el web service.
Ya una vez que se ejecuta podemos ver lo que manda y lo que recibe en el HTTPAnalyzer
***ENCRIPTAR PORCION O PARTE DEL MENSAJE AL WS***
Ahora vamos a encriptar solo una parte del mensaje
Queremos encriptar solo el segundo campo del mensaje
Vamos a ver como funciona esto.
Primero vamos con el cliente (el proxy)
En el archivo de (NombreDelServicio)HTTPSOAP_Stub.xml que modificamos hace un rato, ahí viene la especificación de lo que deberá cifrar o encriptar.
Lo que queremos cifrar es la pregunta al web service, pero solo el segundo campo
Aquí lo seleccione para que se vea. (la pregunta al WS es la parte de outbound, en la parte de encrypt)
Aquí menciona que va a cifrar TODO el Body. Pero eso no es lo que queremos.
Así que agregamos esto.
Para saber cual es el nombre de la variable que se cifrará y el namespace, lo podemos ver en el WSDL del servicio
Así que nuestro cambio en el archivo de Stub quedará así:
Lo guardamos y le damos rebuild.
Y ahora vamos con el server, que también debe identificar que campo va a descifrar
En donde este instalado el contenedor: en mi caso D:\oracle\soasuite\j2ee\home, hay una carpeta de configuración y un archivo llamado wsmgmt.xml en mi caso: D:\oracle\soasuite\j2ee\home\config\wsmgmt.xml
Abrirlo y dar de alta los cambios también, pero en la parte de inbound, decrypt.
Listo, después de hacer esto, hay que reiniciar la aplicación en el servidor de aplicaciones.
Y podemos ejecutar el cliente.
Aquí el resultado. El primero no cifrado, y el segundo cifrado en la pregunta. La respuesta Cifrada.
Espero que les sirva esto.
Saludos!
Wanzjin - Mau