sábado, 24 de mayo de 2008

SEGURIDAD DE WS CON X509 EN JDEVELOPER

 

 

*********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

clip_image002[1]

Y seleccionamos Web service / Java web service

clip_image004[1]

clip_image006[1]

El Nombre del servicio, y la clase a publicar:

clip_image008[1]

Document Wrapped ya que recibe más de un elemento:

clip_image010[1]

Next hasta llegar a los métodos. Seleccionamos los métodos a convertir en WS.

clip_image012[1]

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

clip_image014[1]

Especificamos lo que sigue:

clip_image016[1]

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.

clip_image018[1]

Inbound, seleccionar también Creation Time Required...

clip_image020[1]

En OutBound el mismo caso:

clip_image022[1]

En KeyStore Options:

clip_image024[1]

En Inbound confidentiality:

clip_image026[1]

En Outbound confidentiality:

clip_image028[1]

¡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.

clip_image030[1]

Publicamos con Botón derecho en KeyStore.deploy y seleccionar el oc4j en donde se publicará:

clip_image032[1]

 

 

 

 

*********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

clip_image034[1]

Damos clic en el tab de web services y seleccionamos el WS.

clip_image036[1]

Vamos al tab de administración:

Y damos click en seguridad:

clip_image038[1]

Damos clic en keystore and identity certificates, y agregamos en la siguiente pantalla los datos.

clip_image040[1]

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.

clip_image042[1]

En mi caso es el de BlogSeguridad... etc

Y en vez de ir a la liga del web service, damos click en administración,

clip_image044[1]

Security Provider

clip_image046[1]

El tab de Realms> y en la liga de users

clip_image048[1]

Damos clic en el botón de create

Y definimos el usuario Cliente con el password que se agrego desde el principio.

clip_image050[1]

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

clip_image052[1]

Agregamos en la pantalla el WSDL del servicio

clip_image054[1]

Le mencionamos que lo ejecute contra el server:

clip_image056[1]

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

clip_image058[1]

Seleccionamos lo siguiente en las pantallas:

clip_image060[1]

clip_image062[1]

clip_image064[1]

clip_image066[1]

clip_image068[1]

clip_image070[1]

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

clip_image072[1]

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:

clip_image074[1]

clip_image076[1]

Lo mismo en signature y encryption key:

Una vez que ya este, dar click derecho en el proyecto y seleccionar rebuild

clip_image078[1]

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.

clip_image080[1]

Y Ejecutarlo, pueden ir al menú>View> http analyzer para ver lo que manda el proxy y lo que le contesta el web service.

clip_image082[1]

Ya una vez que se ejecuta podemos ver lo que manda y lo que recibe en el HTTPAnalyzer

clip_image084[1]

 

 

 

 

 

***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)

clip_image086[1]

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

clip_image088[1]

Así que nuestro cambio en el archivo de Stub quedará así:

clip_image090[1]

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.

clip_image092[1]

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.

clip_image094[1]

 

Espero que les sirva esto.

Saludos!

Wanzjin - Mau

sábado, 10 de mayo de 2008

A MI MAMÁ - 10-MAYO-2008

MAMÁ: Te Extraño!


Han pasado ya casi 27 años desde que TU, me diste la vida.
Y por lo que me han contado, habías perdido ya un niño antes de mi,
por lo que mi llegada (en tus palabras) fue una bendición.


Así como para mi, lo fue ver tus ojos al salir de tu ser
y escuchar tu voz que me arrullaba, me acariciaba, me hacia
sentir vivo.


Durante 9 meses esperé, y solo quería verte...


Crecí, y tengo tantos recuerdos...
Pues claro, eres mi mamá, tu me cuidaste, saltabas de la cama
si empezaba a llorar, me alimentaste, me bañaste,
me cambiaste de pañal, me AMASTE...


Me ayudaste a caminar, me enseñaste a hablar, me traías como
muñeco por todos lados, y yo solo repetía cuando caminabas:
MAMÁ, MAMÁ, MAMÁ...


Me tomabas entre brazos, y me dabas tu calor, me educaste,
me enseñaste a ser una persona de buenos sentimientos, sensible,
con mucho corazón, Humilde.


Me enseñaste a amar como tu lo haces.
Me enseñaste a ser feliz y TÚ como hasta ahora me haces muy feliz.


Hasta la fecha te preocupas por mi, siempre llegaba
y querías prepararme de comer, te preocupabas por mi salud, querías conversar conmigo, saber de mi.


Siempre me querías tener al lado tuyo.
Siempre me perseguías para darme un abrazo, un beso.
Siempre tratando de estar conmigo.


Mamá, TE AMO


Gracias por todo lo que has hecho de mi,
Por todo el cuidado, por todas las enseñanzas, por TODO TU SER
Gracias por darme el regalo de la vida y por hacerme TAN FELIZ
Gracias por ser LA MEJOR MADRE DEL MUNDO.
Gracias por TODO EL AMOR, que llevaré dentro de mi hasta mi último día


Hoy no te preocupes porque estemos lejos, sigo aquí, nos vamos a ver,
menos frecuente pero nos vamos a ver.


Pero si me quieres ver cierra tus ojitos, y verás que ahí estoy.
Acerca la mano a tu corazón y siente, porque tus latidos, son los míos.


GRACIAS MAMÁ

PORQUE GRACIAS A TI EXISTO

Y EL EXISTIR ME DEJO CONOCERTE


Mis Padres
TE AMO MAMITA PRECIOSA

FELIZ DIA!
TU HIJO MAU

miércoles, 7 de mayo de 2008

Java WorkList Application : Oracle BPEL

Muchas personas me preguntan como crear una aplicación en java que se conecte al worklist application del sistema del workflow de Oracle SOA Suite. Cuando sigues la documentación y el API, no muchos pueden encontrar la solución a ciertos errores que regresa sobre todo en la conexión al JAZN que tiene por default u otro ambiente de LDAP. Y los que llegan a pasar de aquí se encuentran con la problemática de obtener los datos de la tarea (desplegarlos).

Así que para que no tengan que hacerlo, aquí esta como crear un Java custom worklist application para el workflow de Oracle SOA suite.

Iniciamos el Jdeveloper (mi versión es: 10.1.3.3.0.4157)

-----------------------------------------------------------------------------

BPEL CON WORKFLOW

Antes que otra cosa es necesario tener un código de BPEL que utilice un User Task. En el tutorial de BPEL hay un ejemplo de como crear user tasks (workflows). Lo encuentran aquí: http://download.oracle.com/docs/cd/B31017_01/integrate.1013/b28987/phase10.htm#sthref728

Lo que yo hice para pruebas fue generar un proyecto de BPEL, asíncrono, y todo lo dejé por default. Agregué una actividad user task, como usuario puse a jcooper, y lo que le envío como datos al workflow es el elemento request del flujo de BPEL. Este XSD de request de BPEL, lo utilizaremos después para generar las clases que permiten visualizar los campos de la tarea. Que en este caso, solo es un campo (el que viene por default, tipo string).

Aquí la imagen de mi BPEL para pruebas.

image

-----------------------------------------------------------------------------

ARCHIVO wf_client_config.xml

Hay que modificar el archivo SOA_SUITE_HOME\bpel\system\services\config\wf_client_config.xml

Ya que las clases de Java que generaremos hacen referencia a este archivo para la conexión remota al worklist.

Yo modifiqué los métodos de conexión así:

<ejb> <serverURL>opmn:ormi://HOSTNAME:6003:oc4j_soa/hw_services</serverURL>
<user>oc4jadmin</user>
<password>PASSWORD</password>
<initialContextFactory>oracle.j2ee.rmi.RMIInitialContextFactory</initialContextFactory>
</ejb>

<identityService>
<soapEndPoint>http://HOSTNAME:80/integration/services/IdentityService/identity</soapEndPoint>
</identityService>

En la primera parte el número 6003 es el puerto de OPMN request. oc4j_soa es la máquina virtual en donde se ejecuta BPEL. Y hostname el nombre de mi máquina

En el soapEndPoint el puerto 80, es el puerto por donde escucha el HTTP_Server. Y hostname el nombre de mi máquina

-----------------------------------------------------------------------------

PROYECTO

Ya que tenemos lo anterior generamos un nuevo proyecto:

1. En el TAB de Application>Botón derecho> New Application

2. En Application Name dar un nombre (en mi caso WorklistApplication)

3. Definir un nombre de proyecto (BasicWorklistApplication)

De tal modo que me queda así

image

4. Después sobre BasicWorkListApplication dar click derecho, y seleccionar Project Properties > seleccionar en la nueva ventana Libraries

image

5. Dar click en Add Library. Aquí requerimos de dos librerías, una que ya existe, y la otra que debemos de crear.

6. Seleccionar de la lista JSP Runtime y agregarla.

image

7. Después generamos una nueva librería, para esto damos de nuevo click en Add Library, y en la ventana donde nos permite seleccionar librerías, en la parte de abajo hay un botón que dice New, dar click ahí.

8. En library name: WorklistApplication, en Location seleccionamos User, y la librerías son las siguientes que se muestran en la figura. (OJO: DEBEN DE ESTAR EN EL MISMO ORDEN)

En mi caso mi OracleHome es: D:/oracle/soasuite/.

Buscar esas librerías en su HOME y darlas de alta.

OJO: La ultima es una librería debe bajarse desde aquí:

http://download.oracle.com/otn/java/oc4j/10131/wsclient_extended.zip

image

OJO: En la carpeta de bpel/services/config, debe de estar el archivo wf_client_config.xml que se modificó con los datos de conexión al servidor de BPEL

9. Dar click en aceptar, y de nuevo en Aceptar para cerrar la ventana de las propiedades del proyecto.

Ahora vamos a generar unas clases que serán las que se conecten al servicio de worklist.

10. Dar click derecho sobre el proyecto BasicWorklistApplication, y seleccionar New. Dentro de la nueva ventana, seleccionar SimpleFiles, y despues Java Class.

image

11. En la siguiente ventana:

Name: WorkflowOracle

Package: wanzjin.workflowclient.com

Y dar click en aceptar

12. Código de la clase WorkflowOracle.java

13. Repetir los pasos, pero generar una clase llamada TasksOracle.java, dentro del mismo paquete wanzjin.workflowclient.com

14. Código de la clase TasksOracle.java

Esas clases se encargan de tomar un usuario, un password, seleccionan un método de acceso (jazn), se conectan al worklist de Oracle, y obtienen las tareas de un usuario determinado.

(OJO: para ver las tareas, faltan pasos, pues el código de java debe de conocer cuales son los campos que tiene la tarea. Recuerden que en mi caso el BPEL tiene un usertask y la tarea solo tiene un campo de tipo string)

15. Vamos a generar varios JSP que contendrán la lógica para desplegar tareas. No tienen nada gráfico OK? solo es el esqueleto.

Para generarlos, dar click derecho en el nombre del proyecto, y seleccionar JSP como se muestra:

image

Los JSP que debemos crear son:

Check.jsp

Login.Jsp

Logout.jsp

Modify.jsp

ShowTask.jsp

UserTasks.jsp

(el código esta aquí)

image

Dar el nombre del JSP y dar click en terminar. Generar todos los JSP que se mencionan arriba.

-----------------------------------------------------------------------------

JAXB

Faltan algunas cosas, la primera es

16. Generar las clases de Java que hacen referencia a los campos que tiene la lista de tareas. Estos campos vienen definidos en el esquema de XML (XSD) que utilizamos para crear la tarea. En mi caso, el XSD que sabe los campos de la tarea, es el elemento request de BPEL. Así que voy por el archivo XSD del request. Lo encuentro en donde esta el proyecto de BPEL, en la carpeta de bpel.

image

17. Abrir el developer prompt de BPEL. Esta en Inicio>Oracle [Nombre de la instancia de BPEL] > Oracle BPEL Process Manager > Developer Prompt

Ahí ejecutar el siguiente comando:

orajaxb -outputDir DIRECTORIO_SALIDA -schema UBICACION_XSD

En mi caso lo ejecuté así:

orajaxb -outputDir D:\oracle\JaxbGenerated -schema D:\oracle\jdevstudio10133\jdev\mywork\Pruebas\WorkFlowAplicationTest\bpel\WorkFlowAplicationTest.xsd

Te genera las clases de Java en la carpeta de salida.

image

18. Copiar la carpeta que se generó en el directorio src de nuestro proyecto de Jdeveloper.

image

Y ahora podemos utilizar esas clases. Dar refresh en el applications navigator de Jdeveloper y deberían verse las clases nuevas.

El mío se ve así:

image

-----------------------------------------------------------------------------

Finalmente las clases que están en esta página, hacen referencia a mi esquema de XSD. para que funcione en tu caso, se deben de modificar las clases y los JSP en donde se manda llamar a estas clases.

En mi caso la clase que generó JAXB y las que usa el código son: WorkFlowAplicationTestProcessRequest y WorkFlowAplicationTestProcessRequestImpl

Hay que cambiar los nombres en el código de ejemplo, de acuerdo al nombre que generó el JAXB con tu XSD.

El código a cambiar esta en:

A) TasksOracle.java (ahí esta mi definición de WorkFlowAplicationTestProcessRequest y WorkFlowAplicationTestProcessRequestImpl)

B) ShowTask.jsp (Modificar los atributos que deseas que despliegue la página, en mi caso solo era un atributo, llamado Input "el default de BPEL", por eso en este JSP, dice <%=payload.getInput()%>, simplemente modificarlo con los atributos deseados)

Me parece que solo en esos dos hace referencia.

-----------------------------------------------------------------------------

PRUEBA

Hay que hacer una prueba primero de las clases de java, y de nuestra configuración de los archivos. Para esto ejecutar el BPEL que hicimos al inicio desde la Consola (esto lo hacemos para que exista una tarea en el worklist "para jcooper").

image

En el worklist application dentro de SOA Suite debería verse creada la tarea.

image

Después ejecutar la clase WorkflowOracle.java (tiene un método main que ejecuta la conexión de jcooper y muestra sus tareas en la ventana de Log de Jdeveloper. Debería de verse algo así (eso que seleccioné es el ID de la tarea dentro del sistema):

image

Si funciona esto, probar los JSP ejecutando el Login.jsp

Y ya que funciona, mejorar la parte gráfica de los JSP :P

Así se ve mi java worklist app (para pruebas - nada gráfico):

image

Espero esto ayude :D

Saludos!

Wanzjin

 
Themes by: Free Templates Studio. Powered by Blogger