Documento de Recomendación de Uso de Firma Digital en Comunicación PISEE Ministerio Secretaría General de la Presidencia Santiago, septiembre de 2011 Índice Índice ...................................................................................................................................... 2 Abstracto ................................................................................................................................. 3 Resumen ................................................................................................................................. 3 Generación y Validación de Firma ......................................................................................... 3 Generación de Reference .................................................................................................... 3 Generación de Signature .................................................................................................... 3 Validación de Signature ..................................................................................................... 4 Sintaxis de Signature .............................................................................................................. 4 Consideraciones sobre el elemento KeyInfo ....................................................................... 4 Recomendación Para la Generación de Firma ........................................................................ 5 Implementación de Firma Digital ........................................................................................... 6 Plataforma Integrada de Servicios Electrónicos del Estado 2 Abstracto La firma digital en documentos XML provee servicios de integridad, autenticación del mensaje y/o autenticación del firmante para datos de cualquier tipo. Se explicará la estructura, y se hará una recomendación de cómo firmar un documento XML para consumir un servicio mediante la plataforma PISEE. Resumen La firma digital en documentos XML se representa con el elemento Signature, que tiene la siguiente estructura (“?” representa 0 o 1 ocurrencia, “+” representa 1 o más ocurrencias, y “*” representa 0 o más ocurrencias): <Signature ID?> <SignedInfo> <CanonicalizationMethod/> <SignatureMethod/> (<Reference URI?> (<Transforms>)? <DigestMethod> <DigestValue> </Reference>)+ </SignedInfo> <SignatureValue/> (<KeyInfo>)? (<Object ID?>)* </Signature> El atributo ID del elemento Signature sirve para identificar un fragmento dentro del documento o incluso un recurso externo (identificado por un URI). El ID debe ser único con respecto a los demás elementos del documento. El elemento SignedInfo indica los algoritmos usados para calcular el valor del elemento SignatureValue. El elemento Reference indica cada método/valor de digest (síntesis) calculado sobre el objeto de datos identificado. El elemento KeyInfo indica la llave utilizada para validar la firma. Formas de identificación incluyen certificados, nombres de llave, algoritmos, etc. El elemento es opcional porque puede contener información que el firmante no desea que sea revelada. Generación y Validación de Firma Los siguientes son los pasos para generar el(los) elemento(s) Reference, y el elemento SignatureValue a partir de SignedInfo. Generación de Reference Para cada objeto de datos a ser firmado: 1. Aplicar Transforms al objeto. 2. Calcular el valor de síntesis sobre el objeto resultante. 3. Crear el elemento Reference, incluyendo DigestMethod, DigestValue, y (de forma opcional) Transforms. Generación de Signature 1. Crear el elemento SignedInfo con CanonicalizationMethod, SignatureMethod y Reference(s). Plataforma Integrada de Servicios Electrónicos del Estado 3 2. 3. Calcular el valor de SignatureValue sobre SignedInfo, a partir de los algoritmos especificados en este último. Construir el elemento Signature que incluya SignedInfo, SignatureValue, Object(s) y KeyInfo, siendo los dos últimos opcionales. Validación de Signature 1. Obtener la información de la llave desde KeyInfo, o desde una fuente externa. 2. Obtener la forma canónica de SignatureMethod, usando CanonicalizationMethod, y utilizando el resultado (incluyendo la previamente obtenida KeyInfo) para confirmar el valor de SignatureValue sobre el elemento SignedInfo. Sintaxis de Signature El elemento Signature es el elemento raíz de una firma de un XML. La implementación de cada uno de sus elementos debe regirse por el siguiente esquema: <element name=”Signature” type=”ds:SignatureType”/> <complexType name=”SignatureType”> <sequence> <element ref=”ds:SignedInfo”/> <element ref=”ds:SignatureValue”/> <element ref=”ds:KeyInfo” minOccurs=”0”/> <element ref=”ds:Object” minOccurs=”0” maxOccurs=”unbounded”/> </sequence> <attribute name=”Id” type=”ID” use=”optional”/> </complexType> El elemento SignatureValue contiene el valor de la firma digital; siempre se codifica utilizando base64. La implementación de la obtención de este valor se hace utilizando los algoritmos y métodos representados en el elemento SignedInfo. Si se decide utilizar más de un elemento Transforms (incluido en Reference), hay que considerar su orden, ya que cada elemento se procesa, y su salida sirve de entrada para el siguiente elemento. La salida del último elemento es la entrada para el algoritmo en DigestMethod. Consideraciones sobre el elemento KeyInfo Este elemento permite al receptor obtener la llave necesaria para validar la firma. Todas las declaraciones dentro de KeyInfo se refieren a la misma llave. Entre los tipos que conforman el esquema del elemento, se encuentra el elemento KeyValue, que contiene una llave pública única que puede ser útil para validar la firma. Entre los algoritmos permitidos, se recomienda utilizar el RSA. Si se desea incluir el certificado dentro del elemento X509Data, éste debe ir dentro del elemento X509Certificate, en codificación base64. Como cada elemento completo de X509Data se refieren a un mismo certificado, se pueden obviar los elementos X509IssuerSerial y X509SubjectName, y utilizar tan solo el elemento X509Certificate (y el elemento X509CRL, si se desea incluir una lista, codificada en base64, de certificados para revocación). Vale resaltar que dentro de un elemento KeyInfo se pueden incluir múltiples elementos X509Data, y dentro de cada uno se pueden incluir múltiples elementos X509Certificate, y de esta forma es posible construir una cadena de certificación. Plataforma Integrada de Servicios Electrónicos del Estado 4 Recomendación Para la Generación de Firma Para el caso particular de los servicios entregados por el Registro Civil, se ha detectado que los mejores resultados se dan cuando solo se incluye el elemento X509Certificate, por lo que habría que buscar la forma de que, en las distintas implementaciones de consumo, se genere solamente ese elemento (o también hacer un procesamiento post-generación de firma, para eliminar los elementos “innecesarios”). En definitiva, la recomendación es de que el elemento Signature (con particular atención al elemento KeyInfo) tenga la siguiente estructura detallada a continuación (Para los elementos Transform se sugieren opciones derivadas según el conjunto lenguaje de programación/API de firma digital, que sea utilizado para firmar el documento): <Signature xmlns=”http://www.w3.org/2000/09/xmldsig#”> <SignedInfo> <CanonicalizationMethod Algorithm=”http://www.w3.org/2001/10/xml-exc-c14n#”/> <SignatureMethod Algorithm=”http://www.w3.org/2000/09/xmldsig#rsa-sha1”/> <Reference URI=””> <Transforms> <!--opción 1, se especifica que se va a firmar el nodo “Body”--> <Transform Algorithm=”http://www.w3.org/TR/1999/REC-xpath-19991116”> <XPath xmlns:soap=”http://schemas.xmlsoap.org/soap/envelope”/>ancestor-orself::soap:Body</XPath> </Transform> <!--opción 1.1--> <Transform Algorithm=”http://www.w3.org/2001/10/xml-exc-c14n#”/> <!--fin opción 1.1--> <!--opción 1.2--> <Transform Algorithm=”http://www.w3.org/TR/2001/REC-xml-c14n-20010315”/> <!--fin opción 1.2--> <!--fin opción 1--> <!--opción 2, se especifica que no se incluirá el elemento Signature en el cálculo del valor de la firma--> <Transform Algorithm=”http://www.w3.org/2000/09/xmldsig#enveloped-signature”/> <--fin opción 2--> </Transforms> <DigestMethod algorithm=”http://www.w3.org/2000/09/xmldsig#sha1”/> <DigestValue><!--valor calculado por algoritmo--></DigestValue> </Reference> </SignedInfo> <SignatureValue><!--valor calculado por algoritmo--></SignatureValue> <KeyInfo> <X509Data> <X509Certificate> <!--certificado en base 64--> </X509Certificate> </X509Data> </KeyInfo> </Signature> Plataforma Integrada de Servicios Electrónicos del Estado 5 Implementación de Firma Digital En el lenguaje de programación Java, a partir de la versión 6, se debe utilizar la API (Interfaz de Programación de Aplicaciones) llamada “Java XML Digital Signature API” (Especificación JSR 105). En particular, el package a utilizar es el java.xml.crypto. En los siguientes enlaces se describe en detalle la especificación, el uso de firma digital de documentos XML en Java, y ejemplos de utilización de la API (enlaces originales en inglés): http://download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/overview.html http://java.sun.com/developer/technicalArticles/xml/dig_signatures/ http://java.sun.com/developer/technicalArticles/xml/dig_signature_api/ Para la plataforma .NET, se utilizan clases del namespace System.Security.Cryptography. Se recomienda revisar la documentación de MSDN sobre la firma digital de mensajes SOAP (enlaces en inglés): http://msdn.microsoft.com/en-us/library/aa528764.aspx Plataforma Integrada de Servicios Electrónicos del Estado 6