XML Digital Signature
De acuerdo al RFC2828 una firma digital se define como "un valor calculado mediante un algoritmo criptográfico y añadido a la estructura de un objeto que contiene información de manera que cualquier receptor de la información pueda usar la firma para verificar su origen e integridad".
Solución Factible® provee una herramienta validadora de firma digital XML
para la verificación, para aquellos casos en los que el SAT
requiera que se generen peticiones de esta manera, tales como
Sector primario,
Timbrado - Enviar solicitud cancelación.
Herramienta firma digital XML
Nota: el elemento Signature
se ha incluido dentro
del contenido que se esta firmando, por lo tanto creando una firma envuelta. El extracto
1 muestra el elemento SignedInfo
que contiene
la información que es firmada.
La firma consta de 3 elementos principales, en el elemento SignedInfo
se encuentra la información que se firmó y como se procesó.
SignatureValue
es el resultado del procesamiento
de la información, es decir, la firma KeyInfo
contiene información sobre los elementos necesarios para comprobar la firma.
Con la información incluida en el elemento KeyInfo
más los incluidos en el elemento SignedInfo
se deberá obtener el mismo valor del elemento SignatureValue
,
de no ser así, se concluye que la información fue alterada.
El elemento CanonicalizationMethod
define el algoritmo
usado para el elemento SignedInfo
antes de que sea
firmado o validado.
Canonicalización es el proceso de convertir el contenido XML a su representación
física, llamada forma canónica, a fin de eliminar cambios sutiles que puedan
resultar en una firma inválida sobre la información.
Es necesario aplicar la canonicalización debido a la naturaleza del lenguaje XML
y la forma en la que es analizada por diferentes procesadores e intermediarios, los cuales
pueden cambiar el contenido de forma tal que la firma ya no es válida, sin embargo,
la información firmada aún sea lógicamente equivalente. La canonicalización elimina
estas posibles variantes convirtiendo el XML a su forma canónica antes de generar o validar la firma.
El elemento SignatureMethod
define el algoritmo de firma digital usado para generar la firma,
en este caso es el algoritmo PKCS#1 RSA-SHA1 que se describe en RFC 2437.
Uno o más elementos Reference
identifican la información a ser firmada.
Cada elemento Reference
identifica la información por medio de una URI.
El extracto 1 contiene un solo elemento Reference
, y
el URI es una cadena vacía , lo que indica la raíz del documento.
El elemento Transforms
contiene una lista de uno o más elementos Transform
,
cada uno de los cuales describe un algoritmo de transformación usado para transformar
la información antes de que se haya procesado la digestión y la firma, o antes de que se haya validado.
Este ejemplo contiene un elemento Transform
para el algoritmo
de transformación. La transformación es requerida para las firmas envueltas para que el elemento
Signature
en sí mismo sea removido antes de hacer el calculo del valor de la firma.
De otra manera, la firma se incluiria a si misma en la información a ser firmada, lo cual no es correcto.
El elemento DigestMethod
definido como URI, es el algoritmo usado para
crear la digestión de la información, en este caso, SHA1. El elemento DigestValue
contiene la representación en base64
del valor resultante de la digestión.
El elemento SignatureValue
contiene el valor de la firma codificada en base64
sobre el elemento SignedInfo
,
como se muestra en el extracto 2.
El elemento opcional KeyInfo
contiene información
sobre la llave que se necesita para validar la firma, como lo muestra el extracto 3.
El elemento KeyInfo
puede contener diferentes tipos de información,
en este caso, el elemento KeyName
contiene el número de serie del certificado, pero también puede
contener un elemento X509Data
que contiene a su vez
un elemento X509SubjectName
identificando
el nombre de quien firmó la información, tal es el caso de la
solicitud cancelación.
Validador de firma digital XML
Esta herramienta verifica la validez de la firma digital XML dentro de un archivo.