Saltar al contenido principal
Versión: 4.32

DSS API

Vista general

Redtrust es un gestor corporativo de certificados de autenticación y firma que permite su uso de forma centralizada, segura y controlada.

Aprovechando la centralización de certificados, Redtrust ofrece un servicio de firma para firmas simples y avanzadas, siguiendo el estándar DSS (Digital Signature Service) de OASIS (https://www.oasis-open.org/committees/dss/) y algunas de sus extensiones.

Este documento está dirigido a integradores que deseen utilizar el servidor de firma DSS de Redtrust.

Métodos

El servicio de firma de documentos de Redtrust cumple con el estándar DSS de OASIS y algunas de sus extensiones.

El servicio ofrece tres métodos principales:

1. GetAccessibleCertificates

Esta operación recupera la lista de certificados disponibles para el usuario autenticado, según las políticas de autorización de Redtrust.

Para llamarla, autentícate como el usuario cuyos certificados deseas consultar. La respuesta incluye un objeto Result con la lista de certificados accesibles.

2. SignHash

Esta operación realiza una firma digital sobre un hash previamente calculado utilizando el certificado seleccionado.

Debes llamar a la operación SignHash y proporcionar:

  • El hash que se va a firmar
  • El tipo de firma
  • Los datos de identificación del certificado

El servicio genera una firma en formato PKCS#1. Las secciones siguientes ofrecen más detalles y ejemplos.

3. SignRequest

Realiza una operación completa de firma de documentos basada en el estándar DSS de OASIS.

Para usar esta operación, envía un objeto SignRequest válido conforme al esquema DSS y sus extensiones. Este objeto debe contener toda la información necesaria para generar una firma válida.

El servidor responde con un objeto SignResponse que contiene:

  • Un código de respuesta y un mensaje
  • El resultado del proceso de firma

Consulta la especificación OASIS para la estructura de estos objetos:

Las siguientes secciones explican los elementos requeridos para que puedas construir solicitudes válidas e interpretar las respuestas.

Autenticación

Puedes enviar solicitudes de firma a tres enlaces distintos, según el tipo de autenticación que desees usar (suponiendo que utilizas SOAP 1.2). Debes reemplazar REDTRUST_ID por el DNS o la IP del servidor Redtrust.

Usuario y contraseña

  • Utiliza cabeceras WS-Security UsernameToken.
  • Endpoint: https://REDTRUST_IP:8080/RTDSSService.svc/basic

Autenticación con certificado

  • Requiere un certificado de cliente TLS.
  • Endpoint: https://REDTRUST_IP:8080/RTDSSService.svc/secure

Autenticación con JWToken

Este método permite autenticarse mediante un JSON Web Token (JWT) firmado, incluido en la cabecera SOAP como un BinarySecurityToken.

  • Endpoint: https://REDTRUST_IP:8080/RTDSSService.svc/jwtoken
  • Cabecera de ejemplo:
    <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://localhost:8080/RTDSSService.svc/jwtoken
</wsa:To>
<wsse:Security >
<wsse:BinarySecurityToken
ValueType="urn:custom:jwt"
EncodingType="urn:custom:jwt">eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImN0eSI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3VzZXJkYXRhIjoie1widXNlcm5hbWVcIjpcImRldmVsb3BlclwiLFwidXNlcl9pZFwiOjEsXCJkb21haW5cIjpcImxvY2FsLnVzZXJzXCIsXCJyZWZlcmVuY2VcIjpcImE0YjlhYTg1OWQxNTA5YWRjNTE5NDgyM2ExNmFlNDM2YTQ3ZjUwZjI3ZWZjNjU2ODUyMTg5ZWI5NjY4NDBkNGZcIixcImNvbnN1bWVyXCI6XCJEU1NcIn0iLCJuYmYiOjE3NTAwNzc4ODAsImV4cCI6MTc1MDA3ODE4MCwiaWF0IjoxNzUwMDc3ODgwLCJpc3MiOiJSZWR0cnVzdCBBdXRoIEFQSSIsImF1ZCI6IkRTUyJ9.KzNJl0lDEw2rJ7qQZ3dLKMFI9HpugBdGN5j_zRz6_XI</wsse:BinarySecurityToken>
</wsse:Security>
</soapenv:Header>

<soapenv:Body>
<urn:GetAccessibleCertificates/>
</soapenv:Body>

</soapenv:Envelope>

El token debe ser generado por Redtrust.

Transporte y seguridad

La API DSS de Redtrust utiliza SOAP 1.1 o 1.2 sobre HTTPS para el intercambio de solicitudes y respuestas.

Requisitos de la solicitud

  • Solo se puede incluir un elemento <SignRequest> en el cuerpo SOAP.
  • No se deben incluir elementos XML adicionales en el cuerpo.
  • Se debe usar codificación UTF-8.
  • Se permiten cabeceras SOAP arbitrarias.

Formato de la respuesta

  • El servidor devuelve un elemento <SignResponse> o una falta SOAP.
  • No se incluyen elementos XML adicionales en el cuerpo.
  • Si hay un error de formato o protocolo, se devuelve una falta SOAP.
  • Si la solicitud es válida, se devuelve un código de resultado DSS (incluso si la firma falla).
  • Se usa codificación UTF-8.
  • Se permiten cabeceras SOAP arbitrarias.

Protocolos de seguridad

La API DSS de Redtrust cumple con los siguientes estándares WS:

  • WS-Security 1.1
  • WS-Trust (febrero de 2005)
  • WS-SecureConversation (febrero de 2005)
  • WS-SecurityPolicy 1.1

WSDL

Para descargar el WSDL con la definición completa del servicio, accede a la siguiente URL:

https://REDTRUST_IP:8080/RTDSSService.svc?wsdl

Por defecto, el puerto de conexión es 8080, aunque puede configurarse desde la consola de administración de Redtrust. También por defecto, el protocolo es HTTPS y el certificado del servicio se genera automáticamente durante la instalación, aunque puede modificarse desde la consola. Para que un cliente confíe en el servidor, necesitará la parte pública del certificado, a menos que acepte cualquier certificado.

En el Apéndice 1: WSDL encontrarás el código WSDL necesario para generar el cliente en el lenguaje deseado.

Detalles del protocolo

Optional inputs

Los OptionalInputs contienen información adicional asociada al procesamiento de la petición de firma.

El servicio de Redtrust contempla los siguientes OptionalInputs, algunos de ellos definidos como obligatorios, tal como se especifica a continuación:

Input genérico
ServicePolicyUso futuro.
ClaimedIdentityUso futuro.
LanguageDefine el idioma de los mensajes descriptivos contenidos en la respuesta del servicio (opcional).
AdditionalProfileUso futuro.
SchemasUso futuro.
Input de firma
SignatureTypeFuturo uso en el timestamp.
AddTimestampFuturo uso en el timestamp.
IntendedAudienceUso futuro.
PropertiesUso futuro.
KeySelectorIndica al servicio que certificado debe usar para la firma del documento mediante el thumbprint del mismo (obligatorio).
AdditionalKeyInfoEspecifica si el certificado especificado en KeySelector precisa de verificación por PIN (opcional).
IncludeObjectEspecifica al servicio que se desea una firma de tipo enveloping (opcional).
IncludeEContentEspecifica al servicio que se desea una firma de tipo enveloped, válido para firmas CMS y CadES (opcional).
SignaturePlacementEspecifica al servicio que se desea una firma de tipo enveloped, válido para firmas XmlDsig y XadES (opcional).
SignedReferencesUso futuro.
SignatureFormUsado para determinar el nivel de la firma a realizar (opcional).
VisibleSignatureConfigurationUsado para especificar la representación visual de la firma en firmas PadES (opcional).

Modos soportados

Redtrust permite hacer firmas en diferentes modos. El modo de firma indica al servidor como deben de empaquetarse la firma respecto al documento original de las siguientes maneras:

  • Enveloped: La firma está incluida dentro del documento.
  • Enveloping: El documento está dentro de la firma.
  • Detached: La firma es un objeto separado.

Este campo puede especificarse en la configuración del perfil de firma, de manera fija o dejándolo abierto, o enviándolo como parámetro en el SignRequest. En caso de que se especifique en el SignRequest este valor debe ser compatible con los valores especificados en el perfil de firma.

Dependiendo del tipo de documento a enviar se soportan uno o varios modos. Para indicar el modo en la llamada se usan los OptionalInputs dentro del SignRequest que ofrece el protocolo. Dependiendo del tipo de documento, la manera de especificar el modo es diferente:

Tipo de documentoModo de firma soportadoEspecificación
XMLDetachedNo hay que especificar nada.
EnvelopedHay que especificar el campo SignaturePlacement. Consulta https://docs.oasis-open.org/dss/v1.0/oasis-dss-core-spec-v1.0-os.html#_Toc159076071 para más información.
EnvelopingHay que especificar el campo IncludeObject. Consulta https://docs.oasis-open.org/dss/v1.0/oasis-dss-core-spec-v1.0-os.html#_Toc159076069 para más información.
CMSDetachedNo hay que especificar nada.
EnvelopingHay que especificar el campo IncludeEContent. Consulte https://docs.oasis-open.org/dss/v1.0/oasis-dss-core-spec-v1.0-os.html#_Toc159076070 para más información.
PDFEnvelopedNo hay que especificar nada.

Tanto SignaturePlacement como IncludeObject deben especificar el atributo WhichDocument, que contiene el identificador de documento que se va a firmar. Si el documento no se encuentra en el SignRequest el servidor devuelve un error de documento no encontrado.

Respuesta
<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=”profile” RequestID=”dss-sign-request-1” 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>

Niveles soportados

Redtrust permite realizar firmas en diferentes niveles. El nivel de firma indica al servidor qué objetos incluir en la misma. Cuanto más alto es el nivel, más información se incluye en la firma de manera que es más segura, pero también es más difícil de crear y validar. Los objetos que se pueden incluir en la firma son: la política de firma, sellos de tiempo (timestamp), certificados de la cadena del certificado que firma, validación de los certificados incluidos en la firma.

Este campo puede especificarse en la configuración del perfil de firma, de manera fija o dejándolo abierto, o enviándolo como parámetro en el SignRequest. En caso de que se especifique en el SignRequest este valor debe ser válido para los valores especificados en el perfil de firma.

Dependiendo del tipo de documento a enviar se soportan diferentes niveles:

XML y CMS
BásicoForma más básica de firma, puede ser XMLDsig o CMS.
BESForma básica que simplemente cumple los requisitos legales de la Directiva para firma electrónica avanzada.
EPESForma básica a la que se la ha añadido información sobre la política de firma.
ES_TAñade un campo de sellado de tiempo para proteger contra el repudio.
ES_CAñade referencias a datos de verificación (certificados y listas de revocación) a los documentos firmados para permitir verificación y validación off-line en el futuro (pero no almacena los datos en sí mismos).
ES_XAñade sellos de tiempo a las referencias introducidas por XadES-C para evitar que pueda verse comprometida en el futuro una cadena de certificados.
ES_XLAñade los propios certificados y listas de revocación a los documentos firmados para permitir la verificación en el futuro incluso si las fuentes originales (de consulta de certificados o de las listas de revocación) no estuvieran ya disponibles.
ES_AAñade la posibilidad de sellado de tiempo periódico (por ejemplo cada año) de documentos archivados. Esto previene que lod documentos puedan ser comprometidos debido a la debilidad de la firma durante un periodo largo de almacenamiento.
PDF
BESForma básica que cumple los requisitos legales de la directiva para firma electrónica avanzada.
EPESForma básica a la que se la ha añadido información sobre la política de firma.
LTVEquivalente a ES_A.

Para indicar el nivel en la llamada se usa un OptionalInput dentro del SignRequest:

<SignatureForm xmlns=”urn:evolium:Redtrust:dss:1.0:core:schema”>XXX</SignatureForm>

El valor del tag debe contener uno de los siguientes valores:

urn:oasis:names:tc:dss:1.0:profiles:XadES:forms:BES

urn:oasis:names:tc:dss:1.0:profiles:XadES:forms:EPES

urn:oasis:names:tc:dss:1.0:profiles:XadES:forms:ES-T

urn:oasis:names:tc:dss:1.0:profiles:XadES:forms:ES-C

urn:oasis:names:tc:dss:1.0:profiles:XadES:forms:ES-X-1

urn:oasis:names:tc:dss:1.0:profiles:XadES:forms:ES-X-2

urn:oasis:names:tc:dss:1.0:profiles:XadES:forms:ES-X-L-1

urn:oasis:names:tc:dss:1.0:profiles:XadES:forms:ES-X-L-2

urn:oasis:names:tc:dss:1.0:profiles:XadES:forms:ES-A

urn:oasis:names:tc:dss:1.0:profiles:PadES:forms:LTV

Encapsulamiento

Redtrust permite incluir el documento en la petición de firma de diferentes maneras.

Este campo tiene que venir definido en el SignRequest dentro del elemento InputDocuments. Redtrust actualmente soporta elementos de tipo Document pero no soporta los elementos TransformedData y DocumentHash. Para más información sobre el elemento InputDocuments puede consultar https://docs.oasis-open.org/dss/v1.0/oasis-dss-core-spec-v1.0-os.html#_Toc159076032. Para más información sobre Document puede consultar https://docs.oasis-open.org/dss/v1.0/oasis-dss-core-spec-v1.0-os.html#_Toc159076034.

Dependiendo del tipo de documento a enviar se soportan los siguientes encapsulamientos:

XML

Base64Xml: Contenido del XML en base64. InlineXml: Contenido del XML directamente incrustado. EscapedXml: Contenido del XML escapado.

CMS y PDF

Base64Data: Contenido del fichero codificado en base64. Se debe especificar el tipo de documento que se va a enviar mediante el atributo MimeType. Los MimeType admitidos son application/pdf para archivos PDF y text/plain o application/binary para CMS.

Respuesta
<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=”profile” RequestID=”dss-sign-request-1” 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>