Documento de Recomendación de Uso de Firma Digital en

Anuncio
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
Descargar