Ejemplos de la API DSS
Esta sección proporciona ejemplos de peticiones y respuestas SOAP para operaciones habituales compatibles con la API DSS de Redtrust. Usa estos ejemplos como punto de partida al crear o probar peticiones DSS, o cuando quieras entender cómo se expresan escenarios de firma concretos mediante el protocolo DSS.
Si es la primera vez que trabajas con la API DSS, empieza por el tutorial Primeros pasos con la API DSS.
Todos los ejemplos de esta guía comparten las siguientes características:
- Utilizan SOAP 1.2.
- Los ejemplos de autenticación usan WS-Security
UsernameToken. Algunas secciones también incluyen métodos de autenticación alternativos cuando es relevante. - Las peticiones se envían al endpoint de la API DSS expuesto por Redtrust.
- Cada petición incluye una cabecera WS-Addressing
Actionque identifica la operación que se invoca.
En cada ejemplo se incluyen el sobre SOAP y la cabecera completos para que puedas copiar y pegar las peticiones directamente al realizar pruebas.
Cómo usar estos ejemplos
Estos ejemplos son intencionadamente mínimos y se centran en la estructura de las peticiones y respuestas DSS.
Se asume que:
- Ya tienes acceso a un entorno de Redtrust con el servicio DSS habilitado
- Sabes qué método de autenticación y qué endpoint debes usar
- Tienes configurado un perfil de firma DSS válido en Redtrust
- Ya conoces la huella digital del certificado que quieres usar
Para una guía paso a paso que incluya la configuración del entorno y de SoapUI, consulta el tutorial Primeros pasos con la API DSS.
Descubrimiento de certificados GetAccessibleCertificates
Usa este ejemplo para obtener la lista de certificados disponibles para el usuario autenticado. Puedes añadir un filtro con los valores ecc o eidas.
- Username and Password
- JWT
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:evolium:redtrust:dss:ws">
<soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken wsu:Id="0001">
<wsse:Username>USERNAME</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
<wsu:Created>2024-11-15T11:28:30.080Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
<wsa:Action>urn:evolium:redtrust:dss:ws/RTDSSService/GetAccessibleCertificates</wsa:Action>
<wsa:To>https://IP_REDTRUST:8080/RTDSSService.svc/basic</wsa:To>
</soap:Header>
<soap:Body>
<urn:GetAccessibleCertificates/>
<urn:filter></urn:filter>
</soap:Body>
</soap:Envelope>
<soapenv:Envelope
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:urn="urn:evolium:redtrust:dss:ws">
<soapenv:Header>
<wsa:Action xmlns:wsa="http://www.w3.org/2005/08/addressing">
urn:evolium:redtrust:dss:ws/RTDSSService/GetAccessibleCertificates
</wsa:Action>
<wsa:To xmlns:wsa="http://www.w3.org/2005/08/addressing">
https://IP_REDTRUST:8080/RTDSSService.svc/jwtoken
</wsa:To>
<wsse:Security >
<wsse:BinarySecurityToken
ValueType="urn:custom:jwt"
EncodingType="urn:custom:jwt">TU_JWT</wsse:BinarySecurityToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<urn:GetAccessibleCertificates/>
</soapenv:Body>
</soapenv:Envelope>
El ejemplo devuelve los certificados sobre los que el usuario usuario@dominio tiene permisos en el servicio de firma. Estos certificados incluyen tanto los personales del usuario como aquellos a los que tiene acceso mediante una política.
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/GetAccessibleCertificatesResponse</a:Action>
</s:Header>
<s:Body>
<GetAccessibleCertificatesResponse xmlns="urn:evolium:redtrust:dss:ws">
<Result xmlns:b="http://schemas.datacontract.org/2004/07/RTDSSService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<b:ResultStatus>SUCCESS</b:ResultStatus>
<b:ResultMessage>Operation finalized successfully</b:ResultMessage>
<b:ResultData i:type="b:ArrayOfCertificate">
<b:Certificate>
<b:X509Data>...</b:X509Data>
<b:alias>EIDAS CERTIFICADO PRUEBAS - 99999999R</b:alias>
<b:certificateHandler>6017</b:certificateHandler>
<b:expiration>2024-11-05T14:04:20</b:expiration>
<b:issuer>Ceres</b:issuer>
<b:needPin>false</b:needPin>
<b:needReason>false</b:needReason>
<b:subject>EIDAS CERTIFICADO PRUEBAS - 99999999R</b:subject>
<b:thumbprint>06F13CCD80E271D5355B3BEA322B8CBCE25B35F6</b:thumbprint>
<b:type>PRIVATE</b:type>
</b:Certificate>
</b:ResultData>
<b:TotalItems>1</b:TotalItems>
</Result>
</GetAccessibleCertificatesResponse>
</s:Body>
</s:Envelope>
Firma basada en hash con SignHash
Usa este ejemplo cuando quieras generar una firma (PKCS#1) a partir de un hash precomputado. Puedes especificar tanto el identificador como la huella digital del certificado elegido para realizar la llamada.
La funcionalidad de firma de hashes no está habilitada por defecto con la licencia del servicio de firma y debe solicitarse al equipo de soporte.
Petición
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:evolium:redtrust:dss:ws">
<soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-5F01A1638C9F9A33A1173167092288930">
<wsse:Username>USERNAME</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
<wsu:Created>2024-11-15T11:42:02.889Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
<wsa:Action>urn:evolium:redtrust:dss:ws/RTDSSService/SignHash</wsa:Action>
<wsa:To>https://IP_REDTRUST:8080/RTDSSService.svc/basic</wsa:To>
</soap:Header>
<soap:Body>
<urn:SignHash>
<!--Optional:-->
<urn:toSignHashB64>ybWpO/j3yCfUhzWEWqdHcDgyQ8l5CWwea6Hj+GpI2CA=</urn:toSignHashB64>
<!--Optional:-->
<urn:thumbprint>THUMBPRINT</urn:thumbprint>
<!--Optional:-->
<!--<urn:certificatePin>?</urn:certificatePin>-->
<!--Optional:-->
<urn:algorithm>RSA_SHA256</urn:algorithm>
</urn:SignHash>
</soap:Body>
</soap:Envelope>
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/SignHashResponse</a:Action>
</s:Header>
<s:Body>
<SignHashResponse xmlns="urn:evolium:redtrust:dss:ws">
<Result xmlns:b="http://schemas.datacontract.org/2004/07/RTDSSService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<b:ResultStatus>SUCCESS</b:ResultStatus>
<b:ResultMessage>Operation finalized successfully</b:ResultMessage>
<b:ResultData i:type="c:string" xmlns:c="http://www.w3.org/2001/XMLSchema">JCtCs3wdvCl1Ql0tstzkMczNmNxcnaLNospXPB/miOi++fbG+jP6dTRvBwhJ4triE8TXxXMs5aVyCkl0oj+WumoO2zRGZSSk1mcbjrYuKP8m+gj5yp0bOGGPbvAIaphhqV87oU+2kcyCtNt32E0QQGRGW6kr+ADPctOFOD5loV84hRUqAw8AJQX20XjlKtzkhaDGBQFMGVUODAId/ywpxCYIQOetRXWcLfCNHQE/C4+jaNwamvPTGlVhn0Vr6xWAoN0/BKBk5eDVOynX7J2zl7TErkVrZ4WA2cIbxxuq2vj1MUMV89dDB54E4cc7UduYKzMIj0iEJ+19NL47NM96iQ==</b:ResultData>
</Result>
</SignHashResponse>
</s:Body>
</s:Envelope>
Firma DSS con SignRequest
Todas las firmas basadas en documentos en la API DSS se realizan mediante la operación SignRequest.
Aunque los ejemplos de esta sección se centran en distintos estándares de firma (XAdES, CAdES, PAdES), niveles (BES, T, LTV, EPES) y modos (enveloped, enveloping, detached), todos comparten la misma estructura de alto nivel de la petición.
- Cabecera SOAP con WS-Security y WS-Addressing
SignRequest: especifica un perfil de firmaOptionalInputs: conjunto de entradas opcionales (selección de certificado, forma de firma y funcionalidades opcionales) que controlan cómo se genera la firmaInputDocuments: documento de entrada que se va a firmar
El propio elemento SignRequest es común a todos los escenarios de firma. Las diferencias entre firmas XAdES, CAdES y PAdES, así como entre niveles (BES, T, LTV, EPES) y modos (enveloped, enveloping, detached), se expresan mediante:
- El atributo
Profile, que identifica el perfil de firma definido en Redtrust. - Un elemento
KeySelector, que se utiliza para seleccionar el certificado de firma (normalmente mediante la huella digital). - Un elemento
Documentdentro deInputDocuments, que contiene los datos que se van a firmar.
Los siguientes ejemplos se centran en estas diferencias.
Expresar el modo de firma
El modo de firma define cómo se relaciona la firma con el documento firmado.
El modo puede quedar fijado en la configuración del perfil de firma o dejarse abierto y proporcionarse en la SignRequest. Si se indica un modo en la petición, debe ser compatible con los valores definidos en el perfil de firma.
Los siguientes fragmentos muestran cómo expresar cada modo en la petición.
XML enveloping
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
<soap:Header>
…
</soap:Header>
<soap:Body>
<SignRequest Profile="DSS_PROFILE" RequestID="" xmlns="urn:oasis:names:tc:dss:1.0:core:schema">
<OptionalInputs>
…
<IncludeObject WhichDocument="ID-document-1" xmlns="urn:oasis:names:tc:dss:1.0:core:schema" />
</OptionalInputs>
<InputDocuments>
<Document ID="ID-document-1">
…
</Document>
</InputDocuments>
</SignRequest>
</soap:Body>
</soap:Envelope>
XML enveloped
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
<soap:Header>
…
</soap:Header>
<soap:Body>
<SignRequest Profile="DSS_PROFILE" RequestID="" xmlns="urn:oasis:names:tc:dss:1.0:core:schema">
<OptionalInputs>
…
<SignaturePlacement WhichDocument="ID-document-1" xmlns="urn:oasis:names:tc:dss:1.0:core:schema" />
</OptionalInputs>
<InputDocuments>
<Document ID="ID-document-1">
<Base64Data MimeType="application/pdf">…</Base64Data>
</Document>
</InputDocuments>
</SignRequest>
</soap:Body>
</soap:Envelope>