Saltar al contenido principal
Versión: 4.41

Tutorial: Firma de documentos con MTOM mediante DSS

Este tutorial te muestra cómo enviar documentos al Digital Signature Service (DSS) mediante MTOM (Message Transmission Optimization Mechanism). En lugar de incrustarlo como Base64este, usas SoapUI para enviar una SignRequest que hace referencia al documento como un adjunto MIME.

Al finalizar este tutorial, tendrás una petición de firma basada en MTOM que devuelve una SignResponse de DSS válida.

Contexto

MTOM es un mecanismo SOAP que permite enviar datos binarios de gran tamaño de forma eficiente. En lugar de incrustar el documento como Base64 dentro del cuerpo SOAP, el cliente envía el documento como un adjunto MIME y lo referencia desde el mensaje SOAP mediante XOP.

En DSS, MTOM cambia la forma en que se transporta el documento, no cómo se procesa. La lógica de firma se mantiene, pero la petición utiliza un endpoint específico con MTOM habilitado y una referencia xop:Include en lugar de Base64Data.

Antes de empezar

Antes de empezar, asegúrate de disponer de lo siguiente:

  • Acceso a un entorno de Redtrust con el servicio DSS habilitado
  • Una cuenta de usuario local de Redtrust (usuario@dominio) con una política que permita servicios de firma (consulta la sección Cómo de la política)
  • Al menos un certificado de firma disponible para ese usuario
  • SoapUI u otro cliente HTTP capaz de enviar peticiones SOAP 1.2

Este tutorial parte de una configuración DSS existente y funcional en SoapUI. Si no puedes enviar correctamente una SignRequest estándar (sin MTOM), revisa antes el tutorial de primeros pasos.

Paso 1: Crear una petición MTOM en SoapUI

  1. Crea una nueva SignRequest (o duplica una existente).
  2. Establece la URL de la petición en el endpoint MTOM.
https://REDTRUST_IP:8080/RTDSSService.svc/mtom

Configura la autenticación y WS-Addressing exactamente igual que para las peticiones DSS estándar, tal como se describe en el paso 4 del tutorial de primeros pasos.

Paso 2: Añadir el documento como adjunto

  1. Abre la pestaña Attachments en SoapUI.
  2. Añade el archivo PDF que quieres firmar.
  3. Define el contentID del adjunto (por ejemplo, test.pdf).

Paso 3: Forzar la parte del adjunto a BODY

SoapUI no permite seleccionar BODY como parte del adjunto desde la interfaz gráfica. Para hacerlo manualmente:

  1. Cierra SoapUI. Si modificas el XML con la aplicación abierta, SoapUI puede sobrescribir los cambios.

  2. Localiza el XML del proyecto. El nombre del archivo será NOMBRE_PROYECTO-soapui-project.xml (por ejemplo, RTDSSService-soapui-project.xml).

  3. En la interfaz MTOM, busca la definición del adjunto y sustituye <con:part xsi:nil="true"/> por <con:part>BODY</con:part>. El resultado final debe ser similar a este:

    <con:attachment>
    <con:name>MyDocument.pdf</con:name>
    <con:contentType>application/pdf</con:contentType>
    <con:contentId>test.pdf</con:contentId>
    <con:part>BODY</con:part>
    <con:url>C:/path/to/MyDocument.pdf</con:url>
    </con:attachment>
  4. Guarda los cambios y abre SoapUI.

  5. Selecciona la petición y, en el panel Request Properties (normalmente debajo de la navegación del proyecto), establece Force MTOM en true.

Paso 4: Construir la SignRequest con MTOM

Ahora puedes construir la petición como se muestra a continuación. Ten en cuenta lo siguiente:

  • El contentID del adjunto debe coincidir exactamente con el valor de xop:Include href="cid:...".
  • En MTOM sigues usando el elemento Base64Data, pero sustituyes el texto Base64 por una referencia xop:Include al adjunto MIME.
  • Profile es el nombre del perfil de firma que creaste en Redtrust.
  • Aunque el documento firmado es un PDF, este servicio expone la firma PAdES bajo el espacio de nombres del perfil XAdES. No sustituyas el valor de SignatureForm por una URI de PAdES.
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:oasis:names:tc:dss:1.0:core:schema">
<soap:Body>
<SignRequest Profile="YOUR_DSS_PROFILE" RequestID="TU_PERFIL_DSS" xmlns="urn:oasis:names:tc:dss:1.0:core:schema">
<OptionalInputs>
<Language>en-US</Language>
<KeySelector>
<KeyInfo Id="Thumbprint" xmlns="http://www.w3.org/2000/09/xmldsig#">THUMBPRINT</KeyInfo>
</KeySelector>
<SignatureForm xmlns="urn:evolium:redtrust:dss:1.0:core:schema">urn:oasis:names:tc:dss:1.0:profiles:XAdES:forms:BES</SignatureForm>
</OptionalInputs>
<InputDocuments>
<Document ID="DOCUMENT_ID" xmime:contentType="application/pdf" xmlns:xmime="http://www.w3.org/2005/05/xmlmime">
<Base64Data MimeType="application/pdf">
<xop:Include href="cid:CONTENT_ID" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
</Base64Data>
</Document>
</InputDocuments>
</SignRequest>
</soap:Body>
</soap:Envelope>
Ejemplo de petición
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:oasis:names:tc:dss:1.0:core:schema">
<soap:Body>
<SignRequest Profile="pades-bes-profile" RequestID="pades-bes-profile" xmlns="urn:oasis:names:tc:dss:1.0:core:schema">
<OptionalInputs>
<Language>en-US</Language>
<KeySelector>
<KeyInfo Id="Thumbprint" xmlns="http://www.w3.org/2000/09/xmldsig#">5F5162563AFF01EB353D346C8B786AAA2A0CFB09</KeyInfo>
</KeySelector>
<SignatureForm xmlns="urn:evolium:redtrust:dss:1.0:core:schema">urn:oasis:names:tc:dss:1.0:profiles:XAdES:forms:BES</SignatureForm>
</OptionalInputs>
<InputDocuments>
<Document ID="ID-document-1" xmime:contentType="application/pdf" xmlns:xmime="http://www.w3.org/2005/05/xmlmime">
<Base64Data MimeType="application/pdf">
<xop:Include href="cid:test.pdf" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
</Base64Data>
</Document>
</InputDocuments>
</SignRequest>
</soap:Body>
</soap:Envelope>

Paso 5: Enviar la petición y comprobar el resultado

Si todo está configurado correctamente, DSS devuelve una SignResponse con el documento firmado en la pestaña Attachment de la respuesta.

  <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">urn:evolium:redtrust:dss:ws/RTDSSService/SignRequestResponse</a:Action>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SignResponse RequestID="pades-bes-profile" Profile="pades-bes-profile" xmlns="urn:oasis:names:tc:dss:1.0:core:schema">
<Result>
<ResultMajor>urn:oasis:names:tc:dss:1.0:resultmajor:Success</ResultMajor>
</Result>
<SignatureObject>
<Base64Signature Type="urn:ietf:rfc:3369">
<xop:Include href="cid:http://tempuri.org/1/639058938559817471" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
</Base64Signature>
</SignatureObject>
</SignResponse>
</s:Body>
</s:Envelope>

Próximos pasos