cancel
Showing results for 
Search instead for 
Did you mean: 

PI 7.1: incluir firma digital en el payload

Former Member
0 Kudos

Tengo un escenario rfc to soap en el que necesito mapear los datos de la rfc a un external definition (importado de un wsdl externo) y añadir una firma digital de los mismos al payload del mensaje.

Me han sugerido en [un hilo|; en el foro de PI que lo haga usando un módulo en el canal receptor soap. Sin embargo tengo algunas dudas.

Para empezar dudas sobre el desarrollo del módulo. En la documentación que he revisado indica que se debe desarrollar un EJB de sesión y desplegarlo en el servidor. Sin embargo he visto en el entorno de desarrollo, en la pestaña module del canal, que se pueden incluir módulos que sean librerías java (las opciones son local enterprise bean, remote enterprise bean y java library). ¿Sabe alguien si esto es posible y cómo sería el desarrollo? ¿Habría que desplegar la librería en el servidor o adjuntarlo como imported archive en el entorno de desarrollo? Cualquier información al respecto es bienvenida, ya que si puedo evitar tener que desplegar el ejb mejor.

Por otra parte me gustaría saber si es realmente necesario usar un módulo o sería suficiente con un mapeo java. ¿Qué ventajas e inconvenientes tiene cada opción? ¿Alguna documentación sobre cómo realizar el mapeo java?

Finalmente me gustaría resolver una duda sobre la capacidad de firma y encriptación que se puede usar en el receiver agreement. ¿Qué es exactamente lo que se firma y dónde se almacena exáctamente dicha firma si se usa esta opción? Imagino que será en alguna cabecera soap o algo así, con lo que no me vale para mi problema, pero me gustaría salir de dudas.

Saludos y gracias por anticipado.

Accepted Solutions (1)

Accepted Solutions (1)

iprieto
Contributor
0 Kudos

Hola Eduardo,

Antes de nada me gustaría que me respondieras que tipo de firma digital tienes que aplicar. Si es XML-Signature, CMS, PKCS7 ...para poder responderte mejor.

En caso de que sea XML-Signature puedes usar un Java Mapping para firmar el documento en caso de que no sea una firma XML te recomiendo que lo hagas desde el Java Module.

Con el tema del Adapter Module crea el EJB, no te compliques con las librerías. En el caso de que quieras usar una librería tendrías que crearte un ear de tipo librería y desplegar en EAR. Con el Imported Archive no valdría (aunque no te lo puedo asegurar). El EJB es algo sencillo, solo tienes que crearlo y extender de los interfaces estándar, a continuación implementar el el Bean lo que necesitas realizar con el Payload. Suele funcionar muy bién y aunque parezca complicado no lo és si tienes conocimientos en Java.

En cuanto al mapeo Java sería recomendable su uso, como te he comentado, en el caso de que tengas que firmar XML ya que la estructura del Taget será XML (firmado y sin firmar). El problema de que no sea XML es que la estructura del target si lo va a ser y te vas a encontrar con la necesidad de implementar Java Module para capturar el documento firmado que necesariamente vas a tener que insertar en un tag del target. Por eso te recomiendo que solo uses Java Mapping en el caso de firma XML.

No encuentro la capacidad de firma del receiver agreement, ¿puedes explicarme a que te refieres?

Un saludo

Ivá

Former Member
0 Kudos

Hola Iván gracias por tus respuestas.

La verdad es que estoy bastante verde en este tema de certificados y firmas... Tengo el código para realizar la firma a partir de un objeto Document con lo que la realización del EJB no debe dar muchos problemas. De ahí saco esto:

// Crea DOM XMLSignatureFactory 
String providerName = System.getProperty("jsr105Provider", "org.jcp.xml.dsig.internal.dom.XMLDSigRI");
XMLSignatureFactory xmlSignatureFactory = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());

con lo que supongo que la firma es de tipo XML-Signature. Aunque el keystore al que accede parece ser de tipo PKCS12:

KeyStore ks = KeyStore.getInstance("PKCS12");

Entonces en este caso sería recomendable usar el java mapping ¿no? La estructura de los mensajes de salida me vienen de los external definition que he cargado a partir de los wsdl de varios web services, e incluyen ya los campos de la firma. ¿Alguna indicación de cómo hacer el mapeo? Debería poder acceder al mensaje target pero sin esos campos para aplicarle la firma e incluirla en el mensaje, pero con la estructura que tengo no creo que pueda hacer eso... quizás podría modificar los external definitions para quitar esos campos de la firma (y añadirlos posteriormente en el mapeo java). Bueno no sé si me estoy explicando

En cuanto a la opción de firma del receiver agreement me refiero a lo siguiente. Si en el canal receiver soap marcas Select Security Profile te aparecerá en el receiver agreement varios campos al respecto (también con adaptador XI y algún otro). Entre ellos está el Adapter-Specific Atributes en el que indicas si quieres firmar, encriptar o ambas cosas, y Certificate for Signin (WS Request) donde hay que especificar el keystore view y keystore entry.

Saludos.

iprieto
Contributor
0 Kudos

Hola Eduardo,

En este caso lo tienes fácil ya que puedes usar el Java Mapping. Efectivamente tienes que usar el esquema de los mensajes de salida para hacer esto. Dentro del Java Mapping tendrás que construir el XML con el mismo formato que le indiques en el target por lo que no hará falta utilizar el Java Module Adapter.

Con el tema del keystore, depende donde tengas instalado el certificado. Puede ser en el Keystore de la máquina virtual o en el del J2EE. XML-Siganture es una estructura XML que se tiene que seguir para firmar un XML con este estándar, no tiene relacción XML-Signature con el tipo de certificado que vayas a utlizar. Como sabes PKCS12 es un fichero donde se almacena el certificado x.509, la clave privada y pública, también puedes almacenar en este certificado las jerarquías. Siempre firmas con la clave privada, así que con las clases de lectura de un pkcs12 deberás insertar la clave de paso para poder firmar un documento con la clave privada(espero que esto no te lie).

Para el código fuente de firma, en google seguro que tienes muchos ejemplos.

(Receiver Agreement) Voy a mirar lo que me indicas y si me queda claro que hace te cuento para que sirve.

Un saludo y suerte

Ivá

Former Member
0 Kudos

Gracias Iván. Finalmente he hecho un mapeo java que he probado y funciona a las mil maravillas en el developer. Sólo me falta empaquetarlo en un jar y probarlo ya en PI, pero no creo que haya problemas.

Por cierto si alguien necesita una implementación de la especificación JSR 105 para la firma digital, puede usar los jar contenidos en el Java Web Services Developer Pack Downloads. Con la máquina virtual 1.6 no hace falta pero PI llega hasta la 1.5 en la versión 7.1 (que es la que yo estoy usando) así que esos jar vienen de perlas ;).

Por cierto tengo otro problemilla instalando un certificado en el servidor de PI, abriré un nuevo hilo a ver si alguien me puede echar una mano.

Saludos y gracias de nuevo.

Answers (0)