Integración con Servicio de Firma Digital - wiki - Seguridad
Wiki
Integración con Servicio de Firma Digital
Table of Contents [-]
Introducción
El Servicio de Firma Digital (DSS) está basado en el estándar OASIS DSS, con binding HTTP Post permitiendo interactuar con el usuario a través de redirecciones del navegador y de esa forma no requerir resoluciones de
artefactos punto a punto. El Servicio de Firma Digital es propiedad de AGESIC y se encuentra disponible en la Plataforma de Gobierno Electrónico. Para la integración con el DSS de AGESIC se puede utilizar cualquier tecnología o conjunto de tecnologías que sean capaces de manejar los elementos XML SignRequest y SignResponse del protocolo DSS.
Arquitectura
Descripción de los actores involucrados:
- Servidor DSS dentro de la Plataforma de Gobierno Electrónico.
- Aplicaciones de los organismos que deberán integrarse con el Servidor DSS a través de un componente a desarrollar denominado Cliente DSS.
- Usuarios con documento eID con acceso a las aplicaciones de los organismos integradas con el Servidor DSS
Descripción del servidor DSS
El servidor DSS disponible en la Plataforma de Gobierno Electrónico guía al usuario durante el proceso de firma con el documento de identidad electrónico (eID) mediante una aplicación web y plugin que resuelven la comunicación con el documento eID.
La participación del Servidor DSS en el proceso de firma comienza cuando el usuario del documento eID es redireccionado por la aplicación del organismo integrada.
Una vez que el usuario presiona el botón “enviar” se finaliza el proceso de firma y la aplicación web del Servidor DSS redirige al usuario nuevamente hacia la aplicación del organismo proveniente.
En esta etapa final la aplicación del organismo contendrá la información necesaria para validar que el proceso de firma se haya realizado correctamente.
Descripción del cliente DSS
Se denomina cliente DSS a la aplicación del organismo o componente de la aplicación que deberá manejar los elementos necesarios para utilizar el Servicio de Firma Digital en la Plataforma de Gobierno Electrónico.
El cliente DSS deberá generar el elemento XML SignRequest que el usuario del documento de identidad electrónico (eID) utilizará para iniciar el proceso de firma electrónica en el Servidor DSS.
Luego de finalizado el proceso de firma en el Servidor DSS, la aplicación del organismo recibe el elemento XML SignResponse que contiene información sobre éste proceso.
La validación del elemento XML SignResponse obtenido como resultado del proceso de firma deberá ser realizada por el Cliente DSS.
A modo de resumen, el elemento SignRequest contiene el documento a firmar por el usuario del eID y el elemento SignResponse contiene el resultado de la firma.
Ambos elementos XML deberán ser firmados y validados mediante claves RSA públicas y privadas, el elemento SignRequest deberá ser firmado por una clave privada en custodia del organismo y validado por el Servidor DSS mediante la clave pública y certificado del organismo. El elemento XML SignResponse que envía el Servidor DSS es firmado con la clave privada en custodia del mismo y validado por el organismo utilizando la clave pública y certificado correspondientes.
Flujos de la firma electrónica
El flujo de una firma electrónica utilizando el Servicio de Firma Digital se compone de pasos independientes, es un proceso modular donde pueden ser agregados pasos adicionales.
Un caso de uso estándar es el siguiente:
- El usuario ingresa a la aplicación del organismo integrada con el Servicio de Firma Digital e indica que desea realizar la firma electrónica de un documento.
- La aplicación del organismo mediante el componente Cliente DSS construye firma el elemento SignRequest que contiene el documento indicado por el usuario del eID.
- La aplicación del organismo redirecciona al usuario hacia el portal del Servidor DSS (https://eid.portal.gub.uy/dss/post) con el elemento SignRequest generado.
- El Servidor DSS recibe una petición HTTP POST del usuario conteniendo el elemento SignRequest.
- El Servidor DSS valida la firma y estructura del elemento SignRequest antes de continuar con el proceso de firma la aplicación web.
- En caso de que el SignRequest sea válido, el Servidor DSS redirecciona al usuario a la aplicación web (https://eid.portal.gub.uy/dss/sign) que lo guiará en el proceso de firma.
- El usuario valida la información en pantalla, acepta la instalación del plugin sConnect en el navegador, firma el documento utilizando el eID y siguiendo los pasos indicados en la aplicación web.
- Luego de finalizada la firma del documento, el Servidor DSS redirige al usuario hacia la aplicación del organismo. La URL hacia la cual es redirigido es la contenida en el elemento SignRequest en el tag ML“<SignResponseConsumerURL>…”
- La aplicación del organismo recibe una petición HTTP POST del usuario quecontiene el elemento SignResponse devuelto por el Servidor DSS.
- El Cliente DSS valida que la firma del elemento SignResponse sea correcta.
- El resultado e información de la firma obtenidos del elemento SignResponse es desplegado al usuario en la aplicación del organismo.
Implementación del Cliente DSS
El cliente DSS como componente de software integrado en la aplicación web que desee utilizar los Servicios de Firma Digital deberá tener las siguientes características:
Recibir los documentos a firmar y formatos para construir el “SignRequest” Recibir las respuestas del Servidor DSS “SignResponse“ y obtener información sobre el resultado de la firma realizada. Tendrá acceso a la clave privada utilizada para firmar el “SignRequest” y de esta forma ser un Cliente DSS de confianza para el Servidor DSS.
Dependiendo de la infraestructura y tecnologías del organismo, el Cliente DSS puede considerarse de las siguientes formas:
- Único componente utilizado por las aplicaciones del organismo.
- Integrado en cada aplicacion del organismo.
Siendo las características del cliente DSS las mismas en ambos casos, para el primer caso las aplicaciones del organismo que deseen hacer uso del Servicio de Firma Digital se comunican con la aplicación cliente DSS por ejemplo a través de servicios WEB para el armado del SignRequest y validación del SignResponse.
En el segundo caso las aplicaciones del organismo tienen integrada las características del cliente DSS, se puede ver a cada aplicación como un cliente DSS en sí misma.
Contenidodel SignRequest:
Dentro de la estructura XML del SignRequest se pueden destacar los siguientes elementos:
- ClaimedIdentity: Deberá indicar la identidad del Cliente DSS y contener laURL hacia la cual el usuario es redirigido por el Servidor DSS al finalizar el procesode firma. Nota: La URL es sensible a mayúsculas y minúsculas.En el ejemplo de la imagen son los valores “clienteDSSOrganismo” y la URL "http://clienteDSSOrganismo.uy/RespuestaDSS"
<dss:ClaimedIdentity> <dss:Name Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">clienteDSSOrganismo</dss:Name> <dss:SupportingInfo> <SignResponseConsumerURL xmlns="urn:oasis:names:tc:dssx:1.0:profiles:gemalto:demo">http://clienteDSS-Organismo.uy/RespuestaDSS</SignResponseConsumerURL> </dss:SupportingInfo>
- InputDocuments: Este elemento deberá contener el documento sobre el cual el usuario del eID va realizar la firma. Dependiendo del formato (texto, PDF, XML) puede variar el contenido.En el ejemplo a continuación el documento a firmar es un texto plano representado en el formato base64.El texto a firmar: “Texto a firmar para el taller”.
<dss:InputDocuments> <dss:Document> <dss:Base64Data MimeType="text/plain">VGV4dG8gYSBmgCFyYSBlbCB0YWxsZXlu</dss:Base64Data> </dss:Document> </dss:InputDocuments>
Contenidodel SignResponse:
Dentro de la estructura XML del SignResponse se pueden destacar los siguientes elementos:
- Result: El elemento Result contiene información sobre el resultado de firma de los documentos en el servidor DSS.En el ejemplo a continuación se puede observar un caso de éxito de firma en todos los documentos.
<Result> <ResultMajor>urn:oasis:names:tc:dss:1.0:resultmajor:Success</ResultMajor> <ResultMinor>urn:oasis:names:tc:dss:1.0:resultminor:valid:signature:OnAllDocuments</ResultMinor> </Result>
- SignatureObject: El elemento SignatureObject contiene la firma electrónica del documento enviado.En el ejemplo a continuación contiene codificada en base64 la firma para el texto plano enviado en base64 en el SignRequest.
<SignatureObject> <Base64Signature>MIIHxgY...</Base64Signature> </SignatureObject>
Consideraciones de seguridad
Firma del SignRequest:
La clave privada que utilizara el Cliente DSS para firmar los SignRequest debe ser almacenada teniendo en cuenta los recaudos de seguridad necesarios dado que la misma permite autorizar y autenticar las solicitudes de Firma provenientes del organismo hacia el Servidor DSS.
Se recomienda la utilización de un dispositivo del tipo HSM o Token que cumpla con el estándar FIPS 140-2.
El certificado electrónico correspondiente a la clave privada generada en el dispositivo seguro será entregado a AGESIC para ser dado de alta en el Servidor DSS.
Validación del SignResponse:
Luego de enviado el SignRequest y finalizado el proceso de firma el usuario es redirigido a la aplicación del organismo con el elemento SignResponse.
El elemento SignResponse es firmado con la clave privada del Servidor DSS y debe ser validado por el Cliente DSS utilizando el certificado digital del Servidor DSS.
Puede descargar el certificado del servidor aquí.
Utilización del Servicio de Firma Digital
Para hacer uso del Servicio de Firma Digital, además de implementar los cambios necesarios en las aplicaciones, el organismo y AGESIC deben intercambiar cierta información necesaria para generar la relación de confianza:
- El organismo debe proveer:
- URL de retorno SignResponseConsumerURL para las redirección y envió del SignResponse.
- Certificado electrónico con el cual el cliente DSS firmará los SignRequest DSS
- AGESIC proveerá:
- URL del Servicio de Firma Digital donde recibe las solicitudes de firma.
- Certificado electrónico utilizado por el DSS para firmar los SignResponse
Anexo Técnico
Perfiles DSS
El servidor DSS implementa los perfiles Gemalto DSS AdES y Demo Profile (DP) para la firma electrónica.
El perfil Gemalto DSS AdES como extensión de OASIS DSS AdES define la especificación de los elementos SignRequest y SignResponse para la firma de documentos bajo los formatos CAdES, PAdES y XAdES.
El perfil Demo Profile (DP) define la especificación de los elementos SignRequest y SignResponse para la firma de CMS y plantilla PDF con datos.
La aplicación del organismo entonces deberá construir las solicitudes de firma SignRequest acorde a sus necesidades de negocio. Por ejemplo, en el caso de firma electrónica avanzada de documentos PDF como pueden ser contratos, la construcción del elemento SignRequest debe realizarse ajustada a la especificación definida por el perfil PAdES.
Descripción detallada de los elementos XML SignRequest y SignResponse
El DSS está basado en el estándar OASIS DSS con bindings HTTP POST, sin resolución directa de artefactos.
El proceso de firma comienza con el SignRequest enviado por el usuario del documento eID a través de un HTTP POST en formato base64 y finaliza con la verificación del SignResponse devuelto por el servidor DSS también en formato base64.
El SignRequest contiene el elemento a firmar, el perfil seleccionado para la firma y la dirección URL SignResponseConsumerURL donde el usuario será re direccionado por el servidor DSS para enviar el SignResponse recibido.
Ambos elementos XML (SignRequest, SignResponse) son firmados con una clave privada y validados con su correspondiente certificado electrónico.
La construcción y firma del SignRequest la realiza el cliente DSS quien posee una clave privada y certificado electrónico de confianza para el servidor DSS. De esta forma el servidor DSS puede autenticar y autorizar a sus diferentes clientes.
El SignResponse contiene información sobre el resultado de la firma realizada y el elemento firmado. La aplicación del organismo deberá realizar una validación del elemento SignResponse utilizando el certificado electrónico del servidor DSS.
Estructura del SignRequest y SignResponse
El Servicio de Firma Digital utiliza un binding basado en HTTP POST.
- El SignRequest se envía al servidor en una petición HTTP POST en formato application/x-www-form-urlencoded. El request debe contener un único parámetro SignRequest, con el valor del XML SignRequest codificado en Base64.
- El SignResponse se envía al servidor en un request HTTP POST en formato application/x-www-form-urlencoded. El request debe contener un único parámetro SignResponse, con el valor del XML SignResponse codificado en Base64.
Especificación de los elementos XML del SignRequest, SignResponse para el perfil definido como Demo Profile:
Signature
Namespace: http://www.w3.org/2000/09/xmldsig#
El SignRequest debe estar firmado digitalmente. Esta firma es representada por el elemento Signature, el cual debe estar presente en el elemento OptionalInputs.
InputDocuments
Namespace: urn:oasis:names:tc:dss:1.0:core:schema
El elemento InputDocuments es utilizado para enviar documentos a firmar al servidor DSS. Puede contener los siguientes elementos (exactamente una vez):
- Document
- DocumentHash
- El elemento TransformedData no está soportado.
Document
Namespace: urn:oasis:names:tc:dss:1.0:core:schema
El elemento Document es utilizado para transportar el documento completo a firmar.
El mismo puede contener los siguientes elementos:
- Base64Data
- Other
- Los elementos ID, RefURI, RefType, y SchemaRefs no deben estar presentes.
Base64Data
El elemento Base64Data representa datos codificados en Base64. Soporta el mimetype text/plain.
Other
El elemento Other debe contener un elemento TemplateWithData.
TemplateWithData
El elemento TemplateWithData contiene dos subelementos:
- Data
- Template
- Cada uno de estos elementos debe contener el atributo mimeType.
En el elemento Data, el atributo mimeType debe contener el valor application/json. El elemento debe contener un objeto codificado en Base64 en formato JSON.
En el elemento Template, el atributo mimeType debe contener el valor application/pdf.
El elemento debe contener un documento PDF codificado en Base64.
DocumentHash
Namespace: urn:oasis:names:tc:dss:1.0:core:schema
El elemento DocumentHash contiene los siguientes elementos:
- Transforms debe estar vacío.
- DigestMethod identifica el algoritmo de digest utilizado para calcular el hash del documento del lado del cliente. Los siguientes valores son soportados:
- DigestValue contiene el valor del hash del documento.
SignatureType
Namespace: urn:oasis:names:tc:dss:1.0:core:schema
El elemento SignatureType indica el tipo de firma o timestamp a producir. Los valores soportados por el Demo Profile son:
- urn:ietf:rfc:3369 – Refiere a la firma CMS (RFC 3852)
- urn:oasis:names:tc:dssx:1.0:profiles:gemalto:demo:signaturetype:pdf – Refiere a la firma PDF
El elemento SignatureType debe estar presente en el elemento OptionalInputs.
ClaimedIdentity
Namespace: urn:oasis:names:tc:dss:1.0:core:schema
El elemento ClaimedIdentity indica la identidad del cliente realizando el request. Debe estar presente en el elemento OptionalInputs.
SignResponseConsumerURL
Namespace: urn:oasis:names:tc:dssx:1.0:profiles:gemalto:demo
El elemento SignResponseConsumerURL determina la URL a donde deberá ser enviado el SignResponse. Este elemento debe estar presente en el elemento OptionalInputs/ClaimedIdentity/SupportingInfo.
IncludeEContent
El elemento IncludeEContent es opcional. En caso de estar presente, el servidor debe agregar el documento enviado en el SignResponse. El elemento no debe estar presente si el SignRequest contiene un elemento DocumentHash.
SignatureMethod
El elemento SignatureMethod representa el método de firma solicitado. El único valor posible es SmartCard, especificando que la firma digital debe ser creada utilizando una SmartCard.
El perfil Gemalto DSS AdES es una extensión del perfil OASIS DSS AdES, con definición de un nuevo binding y un conjunto de limitaciones.
El perfil OASIS AdES es definido por la organización OASIS, y puede ser descargado en: http://docs.oasis-open.org/dss/v1.0/oasis-dss-profiles-AdES-spec-v1.0-os.html
El perfil define requests para CAdES, PAdES y XAdES, la extensión de Gemalto implementa el perfil con las siguientes limitaciones:
AdES-BES
El nivel CAdES-BES está soportado. El valor del atributo Content type está preconfigurado en el servidor, habiendo un único valor disponible.
El nivel PAdES-BES está soportado. La apariencia de la firma está pre-configurada en el servidor, habiendo un único valor disponible.
El nivel XAdES-BES está soportado. Los elementos AllDataObjectsTimeStamp y IndividualDataObjectsTimeStamp no están soportados.
AdES-EPES
El nivel EPES está soportado, un valor de policy puede ser pre-configurado en el servidor.
AdES-T
Los niveles CAdES-T y PAdES-T están soportados. El nivel XAdES-T no está soportado.
Elementos opcionales
El elemento ClaimedIdentityes usado para la identificación del Service Provider.
El elemento KeySelector no está soportado.
Especificación de los elementos XML del SignRequest, SignResponse para el perfil definido como Gemalto DSS AdES profile:
Signature
Namespace: http://www.w3.org/2000/09/xmldsig#
El SignRequest debe estar firmado digitalmente. Esta firma es representada por el elemento Signature, el cual debe estar presente en el elemento OptionalInputs.
ClaimedIdentity
Namespace: urn:oasis:names:tc:dss:1.0:core:schema
El elemento ClaimedIdentity indica la identidad del cliente realizando el request. Debe está presente en el elemento OptionalInputs.
SignResponseConsumerURL
Namespace: urn:oasis:names:tc:dssx:1.0:profiles:gemalto:demo
El elemento SignResponseConsumerURL determina la URL a donde deberá ser enviado el SignResponse. Este elemento debe estar presente en el elemento OptionalInputs/ClaimedIdentity/SupportingInfo.
SignatureMethods
Namespace: urn:oasis:names:tc:dssx:1.0:profiles:gemalto:demo
El elemento SignatureMethods especifica los métodos de firma permitidos para procesar el SignRequest. El elemento debe contener al menos un método de firma representado por el elemento SignatureMethod. Si hay más de un método presente, la aplicación debe permitir al usuario seleccionar uno.
El elemento SignatureMethods debe estar presente en el elemento OptionalInputs.
SignatureMethod
El elemento SignatureMethod representa el método de firma solicitado. El único valor posible es SmartCard, especificando que la firma digital debe ser creada utilizando una smart card.
Ejemplo de SignRequest y SignResponse
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <dss:SignRequest xmlns:dss="urn:oasis:names:tc:dss:1.0:core:schema" Profile="urn:gemalto:dss:profiles:demo" RequestID="0.25888494712651455"> <dss:OptionalInputs> <dss:ClaimedIdentity> <dss:Name Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">clienteDSSOrganismo</dss:Name> <dss:SupportingInfo> <SignResponseConsumerURL xmlns="urn:oasis:names:tc:dssx:1.0:profiles:gemalto:demo"> http://clienteDSSOrganismo.uy/RespuestaDSS</SignResponseConsumerURL> </dss:SupportingInfo> </dss:ClaimedIdentity> <dss:IncludeEContent/> <dss:SignatureType>urn:ietf:rfc:3369</dss:SignatureType> <demo:SignatureMethods xmlns:demo="urn:oasis:names:tc:dssx:1.0:profiles:gemalto:demo"> <demo:SignatureMethod>SmartCard</demo:SignatureMethod> </demo:SignatureMethods> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/> <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> <Reference URI=""> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> <DigestValue>lxlSM+0yzDWG6CPJ8gO9DU33KePyC5fE3g7fl2OZFTQ=</DigestValue> </Reference> </SignedInfo> <SignatureValue>rFi5KnOnRT3KpVbirp...</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MIIDezCCAmO...</X509Certificate> </X509Data> </KeyInfo> </Signature> </dss:OptionalInputs> <dss:InputDocuments> <dss:Document> <dss:Base64Data MimeType="text/plain">VGV4dG8gYSBmgcGFyYSBlbCB0YWxsZXIu</dss:Base64-Data> </dss:Document> </dss:InputDocuments> </dss:SignRequest>
Ejemplo de SignRequest:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <SignResponse xmlns="urn:oasis:names:tc:dss:1.0:core:schema" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" xmlns:ns3="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:ns4="urn:oasis:names:tc:dssx:1.0:profiles:gemalto:demo" Profile="urn:gemalto:dss:profiles:demo" equestID="0.2108839114169051"> <Result> <ResultMajor>urn:oasis:names:tc:dss:1.0:resultmajor:Success</ResultMajor> <ResultMinor>urn:oasis:names:tc:dss:1.0:resultminor:valid:signature:OnAllDocuments</ResultMinor> </Result> <OptionalOutputs> <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> <ds:Reference URI=""> <ds:Transforms> <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/> </ds:Transforms> <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> <ds:DigestValue>qg53vYht8ghiFHJWn4LxcAiAAHhlEPoCIDTokbJpwTg=</ds:DigestValue> </ds:Reference> </ds:SignedInfo> <ds:SignatureValue>xZxe6N...</ds:SignatureValue> <ds:KeyInfo> <ds:X509Data> <ds:X509Certificate> MIIGHDCC...</ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </ds:Signature> </OptionalOutputs> <SignatureObject> <Base64Signature>MIIHxgY...</Base64Signature> </SignatureObject> </SignResponse>