Firmas XML

Adobe AIR 1.5 y posterior

Una firma XML es una firma digital representada mediante sintaxis XML. Los datos de una firma XML se pueden utilizar para validar la información firmada que no se haya modificado desde la firma. Asimismo, cuando una entidad emisora de certificados de confianza ha proporcionado el certificado de firma, la identidad del firmante se puede verificar a través de la infraestructura de clave pública.

Una firma XML se puede aplicar a cualquier tipo de datos digitales (en formato binario o XML). Las firmas XML se suelen emplear en los siguientes escenarios:

  • Comprobación de la modificación de recursos descargados o externos.

  • Verificación para conocer si los mensajes proceden de un origen seguro.

  • Validación de la licencia de la aplicación o de los privilegios de suscripción.

Sintaxis admitida de firma XML

AIR admite los siguientes elementos de la recomendación W3C para el procesamiento y la sintaxis de firmas XML:

  • Todos los elementos de la sintaxis de firma fundamentales (sección 4 del documento de la recomendación W3C), excepto el elemento KeyInfo que no se admite por completo.

  • El elemento KeyInfo solo debe contener un elemento X509Data.

  • Un elemento X509Data únicamente debe incluir un elemento X509Certificate.

  • Método de resumen SHA256.

  • Algoritmo de firma RSA-SHA1 (PKCS1).

  • El método de canónico "Canonical XML without comments" (XML canónico sin comentarios) y la transformación.

  • La transformación de firma protegida.

  • marcas de hora

El siguiente documento muestra una firma XML estándar (la mayor parte de los datos criptográficos se han eliminado para simplificar el ejemplo):

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo> 
        <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
        <Reference URI="URI_to_signed_data"> 
            <Transforms> 
                <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>            </Transforms> 
            <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
            <DigestValue>uoo...vY=</DigestValue> 
        </Reference> 
    </SignedInfo> 
    <SignatureValue>Ked...w==</SignatureValue> 
    <KeyInfo> 
        <X509Data> 
            <X509Certificate>i7d...w==</X509Certificate> 
        </X509Data> 
    </KeyInfo> 
</Signature>

Los elementos fundamentales de una firma son los siguientes:

  • SignedInfo: contiene referencias a los datos firmados y los valores de resumen calculados en el momento de la firma. Los propios datos firmados se pueden incluir en el mismo documento que la firma XML o pueden ser externos.

  • SignatureValue: contiene un resumen del elemento SignedInfo cifrado con la clave privada del firmante.

  • KeyInfo: incluye el certificado de firma, así como los certificados adicionales necesarios para establecer la cadena de confianza. Se debe tener en cuenta que aunque el elemento KeyInfo es opcional desde el punto de vista técnico, AIR no puede validar la firma si no se incluye.

Existen tres tipos generales de firmas XML:

  • Protegidas: la firma se inserta dentro de los datos XML que se están firmando.

  • Con protección: los datos XML firmados se incluyen en un elemento Object en el elemento Signature.

  • Separadas: los datos firmados son externos a la firma XML. La información firmada puede estar en un archivo externo. También puede estar en el mismo documento XML que la firma y no solo como elemento principal o secundario del elemento Signature.

Las firmas XML utilizan los URI para hacer referencia a los datos firmados. Las aplicaciones de validación y firma deben usar las mismas convenciones para resolver estos URI. Cuando se utiliza la clase XMLSignatureValidator, se debe proporcionar una implementación de la interfaz IURIDereferencer. Esta implementación es responsable de resolver el URI y devolver los datos firmados como objeto ByteArray. El objeto ByteArray devuelto se resume utilizando el mismo algoritmo que generó el resumen en la firma.

Certificados y confianza

Un certificado consta de una clave pública, información de identificación y posiblemente uno o varios certificados que pertenecen a la entidad emisora de certificados.

Existen dos modos de establecer la confianza en un certificado. Se puede obtener una copia del certificado directamente del firmante; por ejemplo, en soportes físicos o a través de una transmisión digital segura como, por ejemplo, una transacción SSL. También se puede confiar en una entidad emisora de certificados para determinar si el certificado de firma es de confianza.

Para confiar en una entidad de este tipo, el certificado debe proceder de una autoridad de confianza para el equipo en el que se valida la firma. La mayor parte de los fabricantes de sistemas operativos sitúan los certificados raíz de una serie de entidades emisoras de certificados en el almacén de confianza del sistema operativo. Los usuarios también pueden añadir y eliminar certificados del almacén.

Aunque un certificado proceda de una entidad de confianza, aún debe decidir si el certificado pertenece a un usuario de confianza. En muchos casos esta decisión pertenece al usuario final. Por ejemplo, cuando se instala una aplicación de AIR, el archivo de instalación de AIR muestra información de identificación del certificado del editor cuando solicita al usuario que confirme si desea instalar la aplicación. En otros casos, se puede comparar la clave pública u otra información del certificado con una lista de claves aceptables. (Esta lista se debe asegurar, quizás mediante su propia firma, o bien, almacenándola en el almacén local cifrado de AIR, con el fin de que no se pueda manipular.)

Nota: aunque puede optar por confiar en el certificado de firma sin verificación independiente (como cuando se trata de una firma automática), de este modo no se obtienen muchas garantías de nada al verificar la firma. Si no se conoce quién creó una firma, la garantía de que esta no se ha manipulado no es una opción muy eficaz, si es que esta opción sirve de algo. La firma podría ser una falsificación firmada con validez.

Caducidad y revocación de certificados

Todos los certificados caducan. Los certificados también se pueden revocar mediante la entidad emisora de certificados si, por ejemplo, la clave privada relacionada con el certificado se ha robado o pierde su carácter de privacidad. Si una firma aparece en un certificado caducado o revocado, la firma se notificará como no válida a no ser que se haya incluido una marca de hora como parte de la firma. Si se incluye una marca de hora, la clase XMLSignatureValidator validará la firma si el certificado era válido en el momento de la firma.

Una marca de hora es un mensaje digital firmado procedente de un servicio de marca de hora que certifica que los datos se firmaron en una fecha y horas concretas. Las marcas de hora provienen de entidades emisoras y se firman mediante el propio certificado de la entidad emisora de marcas de hora. El certificado de la entidad emisora incorporado a la marca de hora debe ser de confianza en el equipo actual para que la marca de hora se considere válida. XMLSignatureValidator no proporciona ninguna API para designar un certificado diferente para su uso en la validación de marcas de hora.