jueves, 25 de septiembre de 2008

OC4J is configured to make JMX connections via RMIS and fall back to RMI if the RMIS port is not configured

Hola a todos!

Pues el otro dia, estuve jugando con las propiedades de Seguridad del servidor de aplicaciones, y tratando de solucionar un problema, me salio otro que, la verdad ya no sabia ni que era.

El error es:

OC4J is configured to make JMX connections via RMIS and fall back to RMI if the RMIS port is not configured

 

Bueno, esta es la razón por la que a mi me ocurrio, OJO: pueden ser varias causas las de este error.

 

Tuve un problema con Oracle Web Services Manager (OWSM) que es este:

<faultstring>WS-Security process failure:null</faultstring>

 

Y buscando en Metalink encontré esta nota para resolverlo:

Problems With Using a PKCS12 Keystore with Oracle Web Service Manager
Doc ID:     Note:457746.1    

Symptoms

It is a requirement of a project that a PKCS12 keystore be used for the signing of a web service response through the use of Oracle Web Services Manager (OWSM).  After creating this type of keystore using keytool and using this in the request pipeline an error is thrown that states that there was a security process failure.
the error received is as follows:

<SOAP-ENV:Envelope  xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV-Body>
    <SOAP-ENV:Fault>
      <faultcode xmlns:p="http://schemas.oblix.com/ws/2003/08/Faults">p:Client.GenericFault</faultcode>
          <faultstring>WS-Security process failure:null</faultstring>
null</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

The following exeception is thrown in the gateway.log:

wssecurity.SecurityBaseStep - Failure while applying XML Security
java.lang.NullPointerException
at com.cfluent.policysteps.security.wssecurity.SignStep.performXmlSecurity(SignStep.java:170)
at com.cfluent.policysteps.security.wssecurity.SecurityBaseStep.execute(SecurityBaseStep.java:238)
at com.cfluent.pipelineengine.container.DefaultPipeline.executeStep(DefaultPipeline.java:124)
at com.cfluent.pipelineengine.container.DefaultPipeline.execute(DefaultPipeline.java:97)
at com.cfluent.pipelineengine.container.DefaultPolicy$DeferredPipeline.execute(DefaultPolicy.java:63)
at com.cfluent.pipelineengine.container.DefaultPolicy$DeferredPipeline.access$300 (DefaultPolicy.java:18) at com.cfluent.pipelineengine.container.DefaultPolicy.execute(DefaultPolicy.java:126)
at com.cfluent.pipelineengine.container.PipelineContainer.execute(PipelineContainer.java:114)
at com.cfluent.agent.Agent.intercept(Agent.java:123)
at com.cfluent.agent.AgentRuntime.intercept(AgentRuntime.java:200)
at com.cfluent.pipelineengine.util.PolicyInvoker.execute(PolicyInvoker.java:30)
at com.cfluent.pipelineengine.util.InvokerChain.execute(InvokerChain.java:30)
at com.cfluent.gateway.Invoker.execute(Invoker.java:118)
at com.cfluent.gateway.listener.ProtocolListener$ListenerTask.run(ProtocolListener.java:272)
at com.cfluent.gateway.listener.ProtocolListener.invoke(ProtocolListener.java:110)
at com.cfluent.gateway.listener.GatewayRuntime.invoke(GatewayRuntime.java:32)
at com.cfluent.gateway.listener.http.HttpListener.invoke(HttpListener.java:30)
at com.cfluent.gateway.listener.http.ServicesServlet.handlePost(ServicesServlet.java:34)
at com.cfluent.common.servlet.BaseServlet.doPost(BaseServlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
...
...
at java.lang.Thread.run(Thread.java:595)

CSWComponent - Step execution failed: Fault
Code=[http://schemas.oblix.com/ws/2003/08/Faults/GenericFault] Fault
String=[WS-Security process failure:null] Policy=[SID0003001] Pipeline=[Request] Step Name=[Sign Message] Step Class=[com.cfluent.policysteps.security.wssecurity.SignStep]
common.PrepareForServiceStep - Step PrepareForServiceStep called
wssecurity.WSSecurityUtils - Could not find the Security Header
gateway.Invoker - Result of Request Pipeline is 1
Changes

 

 

La nota menciona que vaya al directorio JRE de la SOA Suite y que en el archivo java.security agregue esto:

security.provider.x=org.bouncycastle.jce.provider.BouncyCastleProvider

 

Seguí la nota y no se resolvio mi problema.

Pero no note que hiciera nada raro el Oracle App Server.

Así que deje esa entrada del BouncyCastleProvider.

 

Para mi sorpresa cuando reinicie el IAS.

Dias despues, la consola de administración ya no arrancaba, y me mostraba este mensaje (el cual no te dice NADA):

This OC4J is configured to make JMX connections via RMIS and fall back to RMI if the RMIS port is not configured. The RMIS connection on the OC4J instance null on Application Server null is configured but a connection could not be established. The JMX protocol is specified by the oracle.oc4j.jmx.internal.connection.protocol property in opmn.xml

 

Buscando en internet, no encontre nada, hasta que recorde que había cambiado cosas de seguridad, y cuando quite la entrada del BouncyClastleProvider Funcionó.

 

Asi que si alguien cambio esta propiedad y se olvido (COMO YO) de quitarla. Si la quitan, la consola de administración del IAS funciona de nuevo!

 

Saludos!

Mau

Oracle Web Services Manager

¿Cómo exportar e importar componentes, servicios y pasos personalizados?

En esta guía se muestran los pasos para exportar los componentes, servicios, y pasos personalizados dados de alta en un gateway y después como importarlos en otra instancia de OWSM

La versión de OWSM debe ser 10.1.3.4

Exportando datos de OWSM

Lo primero que haremos será modificar la ubicación en donde se exportaran los datos.

Básicamente lo que hace el “Export” es construir una serie de XML´s que tienen todas las propiedades y características de nuestros servicios y componentes publicados en el OWSM

Para modificar esta ubicación vamos al archivo ORACLE_HOME/owsm/bin/coresv.properties

PASO 1: Modificar la ubicación en donde se hará el export

Aquí modificamos la propiedad db.export.dir.

Mi archivo está ubicado en D:\Oracle\SOASuite\owsm\bin\coresv.properties

db.export.dir=tester

db.import.dir=tester

Aquí estoy dando la ubicación en donde se hará el export y también el import

Ahora ¿en donde debe de estar la carpeta de tester?

PASO 2: Debemos crear la carpeta para exportar datos

Esa carpeta “tester” debe de estar creada en el directorio bin

D:\Oracle\SOASuite\owsm\bin\tester

PASO 3: Creación de archivo LMTInstructions.xml

Este archivo especifica que componentes, servicios y pasos personalizados se exportarán.

El archivo debe ser creado en D:\Oracle\SOASuite\owsm\scripts

Aquí está un ejemplo:

<?xml version="1.0"?>

<lmt-instructions>

<transferable-objects>

<component id="C0003010">

<step-template id="BasicLogProps_v3_0_0_1" version="1">

</step-template>

<service id="SID0003021"></service>

</component>

</transferable-objects>

</lmt-instructions>

¿Qué significa lo anterior?

<component id="C0003010">: Es el componente que vamos a exportar.

En este caso exportaré un gateway con id C0003010

Esto se puede ver en la consola como se muestra a continuación:

clip_image002

En caso de tener un paso personalizado, se debe agregar

<step-template id="BasicLogProps_v3_0_0_1" version="1">

</step-template>

¿De dónde saque el nombre de id BasicLogProps_v3_0_0_1 y la versión 1?

Cuando se construye un paso personalizado, en el formato de XML con el que se da de alta el “custom step”, ahí es en donde viene.

Ejemplo en mi “custom step xml”, la primera parte es esta:

<?xml version="1.0" encoding="UTF-8"?>

<StepTemplate xmlns="http://schemas.confluentsw.com/ws/2004/07/policy"

name=" Basic Log Properties v1.0"

package="oracle.com"

timestamp="AUG 21, 2008 12:00:00 AM"

version="1"

id="BasicLogProps_v3_0_0_1">

Aquí es en donde obtienes el id="BasicLogProps_v3_0_0_1” y también la versión=”1”

Por último la parte de:

<service id="SID0003021"></service>

Son los servicios que deseamos exportar.

Cuando nos metemos al componente gateway y vemos los servicios ahí es en donde viene el id, como se muestra a continuación:

Para llegar a esta pantalla (Policy Management> Register Services > Services)

clip_image004

PASO 4: Ejecutar comando de export

Por último, hay que ejecutar la instrucción wsmadmin exportTransferableObjects como se muestra a continuación:

La ejecución nos pide el password de la base de datos para el usuario orawsm

clip_image006

Si revisamos la carpeta que generé (tester) esto es lo que deberíamos ver:

clip_image008

Dentro de la carpeta generada, esta otra carpeta con el nombre del Componente (C0003010)

Este Fólder (C0003010) en el paso del Import, lo copiaremos un nivel arriba

clip_image010

Importando datos a OWSM

Para importar los datos en otro OWSM debemos hacer lo que sigue

PASO 1: Modificar la ubicación de donde se tomarán los datos para el import

Debemos modificar en el OWSM destino, la ubicación en donde están los datos a importar

Aquí modificamos la propiedad db.import.dir.

Mi archivo está ubicado en D:\Oracle\SOASuite\owsm\bin\coresv.properties

Aquí se muestra como hacerlo:

db.export.dir=tester

db.import.dir=tester

La carpeta de “tester” es la misma de hace un rato.

PASO 2: Copiar la carpeta C0003010 directo en la carpeta Tester

Solo que aquí haremos algo adicional, hay dos opciones.

La primera opción es cambiar la propiedad import y definir: db.import.dir= tester\24sep2008-05-00-18PM (esta es la carpeta que nos generó el export)

Y la opción dos, es copiar la carpeta C0003010, la cual está dentro de la carpeta 24sep2008-05-00-18PM que generó el export, y pegarla directo en la carpeta tester

Es decir, quedaría así:

clip_image012

PASO 3: Crear el archivo LMTInstructions.xml para importar

Ya que tenemos eso, debemos crear un nuevo archivo de LMTInstructions.xml para el Import el cual, debe estar en (D:\Oracle\SOASuite\owsm\scripts)

Este quedará así:

<?xml version="1.0"?>

<lmt-instructions>

<transferable-objects>

<component id="C0003010"

import-name="TestImportCustomV1"

url="http://molvera-es.es.oracle.com/gateway"

monitor-rmi-host="molvera-es.es.oracle.com"

monitor-rmi-port="3118"

monitor-soap="http://molvera-es.es.oracle.com/coreman/services/CoremanMeasurementClient"

monitor-type="rmi"

database-url="jdbc:oracle:thin:@//molvera-es.es.oracle.com:1521/ORCL.ES.ORACLE.COM"

database-driver="oracle.jdbc.driver.OracleDriver"

database-user-id="ORAWSM"

create-new="false"

type="Gateway"

mapped-to-component-id="C0003011">

<step-template id="BasicLogProps_v3_0_0_1"

version="1.0"

import-id="BasicLogProps_v3_0_0_1"

import-name="Basic Log Properties v1.01"

import-version="1">

</step-template>

<service id="SID0003021"

import-name="TestInstalacion"

version="1.0"

wsdl="http://molvera-es.es.oracle.com/InstalacionTest/TestInstalacionWSSoapHttpPort?WSDL"

url="">

</service>

</component>

</transferable-objects>

</lmt-instructions>

Aquí está la descripción del significado del XML

Component id="C0003010": El ID del componente que vamos a importar

Import-name="TestImportCustomV1": Un nombre que le damos al Import

url="http://molvera-es.es.oracle.com/gateway: URL del gateway

monitor-rmi-host="molvera-es.es.oracle.com": Host en donde está instalado el monitor de OWSM

monitor-rmi-port="3118": Puerto del monitor

monitor-soap="http://molvera-es.es.oracle.com/coreman/services/CoremanMeasurementClient": Dirección del Monitor SOAP AXIS

type="Gateway": Tipo de componente, en este caso es un Gateway

mapped-to-component-id="C0003011": El “export” se hizo desde un component con ID 3010, en caso de que el ID del destino sea diferente es aquí en donde se especifica. En mi caso borraré el componente gateway 3010, y cuando agregue uno nuevo se creará con ID 3011. Por eso aquí especifico 3011

step-template id="BasicLogProps_v3_0_0_1": El nombre del “custom step id”

version="1.0": Versión del “custom step”

import-id="BasicLogProps_v3_0_0_1": El nombre con el que deseamos que se importe el “custom step” (Lo mejor es dar el mismo nombre)

import-name=" Basic Log Properties v1.01": Nombre del paso personalizado.

Este se puede ver en el OWSM origen en:

Consola OWSM> Policy Management> Manage Policies> Steps

Lo que aparece en la columna de name es lo que debemos dar en la propiedad import-name

Service id="SID0003021": ID del servicio que se quiere importar

wsdl="http://molvera-es.es.oracle.com/InstalacionTest/TestInstalacionWSSoapHttpPort?WSDL": WSDL del web Service original

url="": en caso de que exista una página JSP, se puede agregar aquí

PASO 4: Ejecutar el comando para Importar

Ya que tenemos el archivo hay que ejecutar el comando wsmadmin.bat importTransferableObjects

Ejecutar:

clip_image014

Por último hay que copiar el JAR del “custom step” (en caso de que exista un “custom step”) en la carpeta de ORACLE_HOME/owsm/samples/customsteps y también en ORACLE_HOME/owsm/lib/custom

Reiniciar el contenedor del OWSM

Espero les ayude esto!

Saludos!

Mau

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

 
Themes by: Free Templates Studio. Powered by Blogger