viernes, 5 de julio de 2013

Ejecutando WebCenter Spaces WSDL API en WebCenter Portal (JDeveloper)

Para llamar WebCenter Spaces WSDL API desde una aplicación de WebCenter Portal se requiere la  configuración de la confianza y seguridad entre los dominios en los que se ejecutan.

Versión en inglés

Anteriormente publiqué un post hablando de esta configuración. Integrando Spaces en Portal
En este quiero detallar el proceso de configuración y los posibles problemas que se pueden encontrar.

Spaces Data Control
En este tutorial se explica concretamente como configurar la seguridad para un escenario en el que hay una instalación de WebCenter Spaces y se quiere ejecutar desde una WebCenter Portal corriendo en el servidor integrado. En diferentes arquitecturas o topologías esta configuración puede ser un poco distinta.

Generando los ficheros Java Key Store

Los archivos que se generarán para configurar el KeyStore tanto del productor (Spaces)
  • webcenter.jks: Usado por el dominio de WebCenter e incluyendo el certificado webcenter_public.cer
  • external_webcenter_custom.jks: Usado por el dominio integrado de JDeveloper. Incluye su propio certifiacdo y webcenter_public.cer para la securizacion y confianza de la llamada a Spaces WSDL.
Para WebCenter Domain:
keytool -genkeypair -keyalg RSA -dname "cn=spaces,dc=vassit,dc=com" -alias webcenter -keypass welcome1 -keystore webcenter.jks -storepass welcome1 -validity 1064
keytool -exportcert -v -alias webcenter -keystore webcenter.jks -storepass welcome1 -rfc -file webcenter_public.cer
keytool -importcert -alias webcenter_public -file webcenter_public.cer -keystore webcenter.jks -storepass welcome1

Para JDeveloper Domain:
keytool -genkeypair -keyalg RSA -dname "cn=external_webcenter_custom,dc=vassit,dc=com" -alias external_webcenter_custom -keypass welcome1 -keystore external_webcenter_custom.jks -storepass welcome1 -validity 1024
keytool -exportcert -v -alias external_webcenter_custom -keystore external_webcenter_custom.jks -storepass welcome1 -rfc -file external_webcenter_custom_public_key.cer
keytool -importcert -alias external_webcenter_custom_public_key -file external_webcenter_custom_public_key.cer -keystore webcenter.jks -storepass welcome1
keytool -importcert -alias webcenter_public -file webcenter_public.cer -keystore external_webcenter_custom.jks -storepass welcome1

La carpeta donde se han generado los ficheros debería verse como en la siguiente imagen:
Archivos JKS y CER generados

Configurando el KeyStore de WebCenter Domain

La configuración del Java Key Store para el dominio de WebCentet puede hacerse por dos vías diferentes:
  • Usando Fusion Middleware Console.
  • Usando comandos WLST.
Antes de empezar la configuración, copia el archivo webcenter.jks a: 

 ../[DOMAIN_HOME]/config/fmwconfig


Copiar webcenter.jks a fmwconfig

Configurando usando la Fusion Middleware Console:
  • Ve a Domain -> Security -> Security Provider Configuration -> Keystore (Configure).
Configuración de seguridad del dominio de WebCenter
    Configurar KeyStore
  • Configura el path donde se encuentra el keystore (path relativo a la carpeta fmwconfig) y los alias de los certificados generados.
    Configuración de los Alias/Certificados
Despues de configurar el keystore se requiere un reinicio completo del Dominio de WebLogic así como de los servidores.

Configurando usando WLST:

Editar [DOMAIN_HOME]/config/fmwconfig/jps-config.xml cambiando la siguiente linea:

<serviceInstance name="keystore.inst.0" provider="keystore.provider" location="./webcenter.jks">
            <description>Default JPS Keystore Service</description>


Ejecuta WLST en [WC_HOME]/common/bin y conecta con el dominio de WebCenter para ejecutar los siguientes comandos que actualizan los alias/credenciales:

updateCred(map="oracle.wsm.security", key="keystore-csf-key", user="owsm", password="welcome1", desc="Keystore key")
updateCred(map="oracle.wsm.security", key="enc-csf-key", user="webcenter", password="welcome1", desc="Encryption key")
updateCred(map="oracle.wsm.security", key="sign-csf-key", user="webcenter", password="welcome1", desc="Signing key")

Despues de configurar el keystore se requiere un reinicio completo del Dominio de WebLogic así como de los servidores.

Configurando JDeveloper/Integrated WebLogic Domain Keystore

El servidor integrado de WebLogic de JDeveloper no trae por defecto la consola de Fusion Middleware. Esta puede ser instalada, pero no es necesario para la configuración. La actualización en el cliente se realizará usando WLST siguiendo los siguientes pasos:

Copia el archivo JKS generado para el cliente, external_webcenter_custom.jks, en la carpeta de configuración del dominio del WebLogic Integrado de JDeveloper:

C:\Users\[User]\AppData\Roaming\JDeveloper\system11.1.1.6.38.61.92\DefaultDomain\config\fmwconfig



Edit jps-config to change the keystore used:


<serviceInstance name="keystore" provider="keystore.provider" location="./external_webcenter_custom.jks">
            <description>Default JPS Keystore Service</description>
 


Ve a la carpeta de la Oracle Middleware Home (Por defecto suele ser C:\Oracle\Middleware\oracle_common\bin).

Ejecuta WLST y conecta al dominio integrado de WebLogic para ejecutar la actualización de los credenciales:

updateCred(map="oracle.wsm.security", key="keystore-csf-key", user="owsm", password="welcome1", desc="Keystore key")
updateCred(map="oracle.wsm.security", key="enc-csf-key", user="external_webcenter_custom", password="welcome1", desc="Encryption key")
updateCred(map="oracle.wsm.security", key="sign-csf-key", user="external_webcenter_custom", password="welcome1", desc="Signing key")

Despues de configurar el keystore se requiere un reinicio completo del Dominio de WebLogic así como de los servidores.

Test

Para ejecutar una prueba de concepto si la configuración fue hecha correctamente usa el siguiente snippet de código:

GroupSpaceWSContext context = new GroupSpaceWSContext();
context.setEndPoint("http://[Host]:[Port]/webcenter/SpacesWebService");
context.setSamlIssuerName("www.oracle.com");
context.setRecipientKeyAlias("webcenter_public");
try {
    GroupSpaceWSClient groupSpaceWSClient =
        new GroupSpaceWSClient(context);
    List<String> gspaceList = groupSpaceWSClient.getGroupSpaces(null);
    for (String name : gspaceList) {
        System.out.println(name);
    }
} catch (Exception e) {
    e.printStackTrace();
}

En caso de no funcionar hecha un ojo a la siguiente sección sobre problemas comunes.

Problemas y soluciones a errores comunes de la configuración

SOAP Fault error caused because headers can’t be read

Tras la primera ejecución de los Web Services es común que no se hayan configurado las policies adheridas al Web Service de Spaces. Para configurar las policies asociadas sigue los siguientes pasos:
  • Ve a la configuración de Web Services de WebCenter Spaces en la Fusion Middleware Control:
    Configuración de los WebServices de Spaces
  • En la pestaña Web Service Endpoints selecciona SpacesWebServiceSOAPHttpPort.
    Lista de WebServices
  • Añade al menos oracle/wss11_saml_token_with_message_protection_service_policy dado que la petición estará llamando con la policy:
    wss11_saml_token_with_message_protection_client_service_policy
    Politicas de seguridad adjuntas
  • Prueba de nuevo

Diferente SamlIssuerName

Como puedes comprobar en el código del snippet, se usa:
context.setSamlIssuerName("www.oracle.com");

Ese issuer viene configurado por defecto en la instalación de WebCenter.

En caso de querer registrar otro distinto, cambia el saml.loginmodule en la configuración de la seguridad del dominio a través de la Fusion Middleware Console.
Lista de módulos de autenticación
Lista de SAML Issuers

oracle.wsm.security.SecurityException: WSM-00060 : Error validating timestamp.

En el caso de que los dominios de WebCenter y JDeveloper esten en rangos horarios distintos entonces hay que configurar la propiedad clockSkew para configurar el desfase que hay entre los entornos.

Referencia: http://docs.oracle.com/cd/E23943_01/web.1111/b32511/managing.htm#BABHIFDD

Por ejemplo:
WebCenter Domain esta Spain, JDeveloper Client esta en UK.
UK está una hora por detrás de España y por ello se requiere realizar la siguiente configuración:

  • Ve al archivo policy-accesor-config.xml en la carpeta fmwconfig del dominio de JDeveloper
  • Cambia:

    <interceptor name="BindingSecurityInterceptor"
    class="oracle.fabric.common.BindingSecurityInterceptor"
    category="security">
            <properties>
                <property name="agent.clock.skew">360</property>
                <property name="agent.nonce.ttl">28800</property>
                <property name="agent.expire.time">300</property>
                <property name="agent.allow.all.xpaths">false</property>
            </properties>
    </interceptor>

    Por

    <interceptor name="BindingSecurityInterceptor"
    class="oracle.fabric.common.BindingSecurityInterceptor"
    category="security">
            <properties>
                <property name="agent.clock.skew">3600</property>
                <property name="agent.nonce.ttl">28800</property>
                <property name="agent.expire.time">300</property>
                <property name="agent.allow.all.xpaths">false</property>
            </properties>
    </interceptor>
El cambio ha sido incrementar agent.clock.skew a 3600 (1hora de diferencia en segundos).