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
- Crea una nueva
SignRequest(o duplica una existente). - 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
- Abre la pestaña Attachments en SoapUI.
- Añade el archivo PDF que quieres firmar.
- Define el
contentIDdel 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:
-
Cierra SoapUI. Si modificas el XML con la aplicación abierta, SoapUI puede sobrescribir los cambios.
-
Localiza el XML del proyecto. El nombre del archivo será
NOMBRE_PROYECTO-soapui-project.xml(por ejemplo,RTDSSService-soapui-project.xml). -
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> -
Guarda los cambios y abre SoapUI.
-
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
contentIDdel adjunto debe coincidir exactamente con el valor dexop:Include href="cid:...". - En MTOM sigues usando el elemento
Base64Data, pero sustituyes el texto Base64 por una referenciaxop:Includeal adjunto MIME. Profilees 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
SignatureFormpor 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
- Consulta la referencia de la API DSS para obtener información más detallada sobre los elementos de las peticiones.