Aspectos básicos de la validación de firmas XML

Adobe AIR 1.5 y posterior

Para ver una explicación rápida y ejemplos de código de la validación de firmas XML, consulte los siguientes artículos de inicio rápido del Centro de desarrollo de Adobe:

Adobe® AIR® proporciona la clase XMLSignatureValidator y la interfaz IURIDereferencer para validar firmas XML. La sintaxis XML aceptada por la clase XMLSignatureValidator es un subconjunto de la recomendación W3C para el procesamiento y la sintaxis de la firma XML (XML Signature Syntax and Processing). (Debido a que solo se admite un subconjunto de la recomendación, no todas las firmas legales se pueden validar.) AIR no proporciona ninguna API para crear firmas XML.

Clases de validación de firma XML

La API de validación de firma XML incluye las siguientes clases:

Paquete

Clases

flash.security

Las constantes de la cadena XMLSignatureValidator se definen en las siguientes clases:

flash.events

Uso de las clases de validación de firma XML

Para utilizar la clase XMLSignatureValidator para validar una firma XML, se debe realizar lo siguiente:

  • Cree un objeto XMLSignatureValidator.

  • Proporcione una implementación de la interfaz IURIDereferencer. El objeto XMLSignatureValidator llama al método dereference() de IURIDereferencer, transmitiendo el identificador URI para cada referencia de una firma. El método dereference() debe resolver el URI y devolver los datos a los que se hace referencia (que pueden estar en el mismo documento como firma o encontrarse en un recurso externo).

  • Defina la configuración de la validación de referencia, comprobación de revocación y confianza de certificado del objeto XMLSignatureValidator según sea conveniente para su aplicación.

  • Añada detectores de eventos para los eventos complete y error .

  • Llame al método verify() , transmitiendo la firma para validar.

  • Controle los eventos complete y error e interprete los resultados.

El siguiente ejemplo implementa una función validate() que verifica la validez de una firma XML. Las propiedades XMLSignatureValidator se establecen de tal modo que el certificado de firma debe estar en el almacén de confianza del sistema, o bien, encadenarse a un certificado del almacén de confianza. En el ejemplo también se supone que existe una clase IURIDereferencer adecuada denominada XMLDereferencer .

private function validate( xmlSignature:XML ):void 
{ 
    var verifier:XMLSignatureValidator = new XMLSignatureValidator(); 
    verifier.addEventListener(Event.COMPLETE, verificationComplete); 
    verifier.addEventListener(ErrorEvent.ERROR, verificationError); 
    try 
    { 
        verifier.uriDereferencer = new XMLDereferencer(); 
 
        verifier.referencesValidationSetting = 
            ReferencesValidationSetting.VALID_IDENTITY; 
        verifier.revocationCheckSetting = RevocationCheckSettings.BEST_EFFORT; 
        verifier.useSystemTrustStore = true; 
         
        //Verify the signature 
        verifier.verify( xmlSignature ); 
    } 
    catch (e:Error) 
        { 
            trace("Verification error.\n" + e); 
        } 
} 
 
//Trace verification results 
private function verificationComplete(event:Event):void 
 
    var signature:XMLSignatureValidator = event.target as XMLSignatureValidator; 
    trace("Signature status: " + signature.validityStatus + "\n"); 
    trace("  Digest status: " + signature.digestStatus + "\n"); 
    trace("  Identity status: " + signature.identityStatus + "\n"); 
    trace("  Reference status: " + signature.referencesStatus + "\n"); 
} 
 
private function verificationError(event:ErrorEvent):void 
{ 
    trace("Verification error.\n" + event.text);                 
}

Proceso de validación de firma XML

Cuando se llama al método verify() de XMLSignatureValidator, AIR realiza los siguientes pasos:

  • El motor de ejecución verifica la integridad criptográfica de la firma utilizando la clave pública del certificado de firma.

  • El motor de ejecución establece la integridad criptográfica, identidad y veracidad del certificado en función de la configuración actual del objeto XMLSignatureValidator.

    La confianza en el certificado de firma es fundamental para la integridad del proceso de validación. La validación de la firma se lleva a cabo mediante un proceso criptográfico bien definido, pero la veracidad del certificado de firma es un criterio que no se puede adoptar mediante algoritmos.

    En general, existen tres formas de decidir si un certificado es de confianza:

    • Confiar en las entidades emisoras de certificados y el almacén de confianza del sistema operativo.

    • Obtener, directamente del firmante, una copia del certificado, otro certificado que sirva como delimitador de confianza para el certificado, o bien, información suficiente para identificar de forma fiable el certificado como, por ejemplo, la clave pública.

    • Preguntar al usuario final de la aplicación si confía en el certificado. Esta consulta no es válida en certificados con firma automática, ya que la información de identificación del certificado no es fiable de forma inherente.

  • El motor de ejecución verifica la integridad criptográfica de los datos firmados.

    La información firmada se verifica con la ayuda de la implementación de IURIDereferencer. Para cada referencia del documento de la firma, se llama al método dereference() de la implementación de IURIDereferencer. Los datos que devuelve el método dereference() se utilizan para calcular el resumen de referencia. El valor de resumen se compara con el resumen registrado en el documento de la firma. Si los resúmenes coinciden, la información no se ha modificado desde que se firmó.

    Una consideración importante al confiar en los resultados de la validación de una firma XML es que únicamente lo que se firma es seguro. Tomemos como ejemplo un manifiesto firmado que incluye los archivos en un paquete. Cuando XMLSignatureValidator verifica la firma, únicamente comprueba si el propio manifiesto está sin modificar. Los datos de los archivos no están firmados, por lo que la firma validará cuando los archivos a los que se hace referencia en el manifiesto se modifiquen o se eliminen.

    Nota: para verificar archivos en este manifiesto, puede calcular el resumen de los datos del archivo (con el mismo algoritmo hash utilizado en el manifiesto) y comparar el resultado con el resumen almacenado en el manifiesto firmado. En algunos casos, también se debe comprobar la presencia de archivos adicionales.

Interpretación de los resultados de validación

Los resultados de validación se notifican mediante las propiedades de estado del objeto XMLSignatureValidator. Estas propiedades se pueden leer una vez que el objeto validador distribuya el evento complete . Entre las cuatro propiedades de estado se incluyen: validityStatus , digestStatus , identityStatus y referencesStatus .

Propiedad validityStatus

La propiedad validityStatus notifica la validez general de la firma. validityStatus depende del estado de las otras tres propiedades y puede disponer de los siguientes valores:

  • valid : si las propiedades digestStatus , identityStatus y referencesStatus son todas válidas .

  • invalid : si una o varias de las propiedades de estado individuales son no válidas .

  • unknown : si una o varias de las propiedades de estado individuales son unknown y ningún estado individual es invalid .

Propiedad digestStatus

La propiedad digestStatus indica los resultados de la verificación criptográfica del resumen del mensaje. La propiedad digestStatus puede tener uno de los siguientes valores:

  • valid : si el propio documento no se ha modificado desde la firma.

  • invalid : si el documento de firma se ha modificado o presenta un formato incorrecto.

  • unknown : si el método verify() no se ha completado sin error.

Propiedad identityStatus

La propiedad identityStatus notifica el estado del certificado de firma. El valor de esta propiedad depende de varios factores, entre los que se incluyen:

  • La integridad criptográfica del certificado.

  • Si el certificado ha caducado o se ha revocado.

  • Si el certificado es de confianza en el equipo actual.

  • El estado del objeto XMLSignatureValidator (por ejemplo, si los certificados adicionales se han agregado para crear la cadena de confianza, si dichos certificados son de confianza y los valores de las propiedades useSystemTrustStore y revocationCheckSettings ).

La propiedad identityStatus puede contar con los siguientes valores:
  • valid : para considerarse válida, el certificado de firma debe cumplir las siguientes condiciones:

    • El certificado no debe presentar modificaciones.

    • El certificado de firma no debe haber caducado ni haber sido revocado, excepto cuando una marca de hora válida está presente en la firma. Si la firma incluye una marca de hora, el certificado se considerará válido si ya lo era en el momento en que se firmó el documento. (El certificado utilizado por el servicio de marca de hora para firmar la marca de hora debe encadenarse con un certificado raíz de confianza en el equipo del usuario.)

    • El certificado es de confianza. Se puede confiar en el certificado si este se encuentra en el almacén de confianza del sistema o si se encadena a otro certificado del almacén y la propiedad useSystemTrustStore se establece en true. También puede designar un certificado como de confianza con el método addCertificate() del objeto XMLSignatureValidator.

    • De hecho, el certificado es el certificado de firma.

  • invalid : el certificado ha caducado o se ha revocado y no existe ninguna marca de hora que pruebe la validez en el momento de la firma, o bien, el certificado se ha modificado.

  • unknown : si el certificado no es válido y tampoco es de confianza. Por ejemplo, los certificados con firma automática se notificarán como unknown (a no ser que sean de confianza de forma explícita). identityStatus también se notifica como unknown si el método verify() no se ha completado sin error o si la identidad no se ha comprobado porque el resumen de la firma no es válido.

Propiedad referencesStatus

La propiedad referencesStatus indica la integridad criptográfica de las referencias en el elemento SignedData de la firma.

  • valid : si el resumen calculado de todas las referencias de la firma coincide con el resumen correspondiente registrado en la firma XML. Un estado valid indica que los datos firmados no se han modificado.

  • invalid : si algún resumen calculado no coincide con el resumen correspondiente en la firma.

  • unknown : si los resúmenes de referencia no se han comprobado. Las referencias no se comprueban si el resumen de firma general es invalid o el certificado de firma no es válido. Si identityStatus es unknown , las referencias solo se comprueban cuando referencesValidationSetting es validOrUnknown .