Sobre assinaturas XML

Adobe AIR 1.5 e posterior

Uma assinatura XML é uma assinatura digital representada em sintaxe XML. Os dados de uma assinatura XML podem ser usados para validar as informações assinadas que não tenham sido alteradas desde sua realização. Além disso, quando um certificado de assinatura é emitido por uma autoridade de certificação confiável, a identidade de quem assina pode ser verificada por meio de uma infraestrutura de chave pública.

É possível aplicar uma assinatura XML a qualquer tipo de dado digital (em formato binário ou XML). Assinaturas XML geralmente são usadas para finalidades como:

  • verificar se recursos externos ou baixados foram modificados

  • verificar se mensagens vêm de uma fonte conhecida

  • validar privilégios de licença de aplicativo ou assinatura

Sintaxe de assinatura XML com suporte

O AIR oferece suporte aos seguintes elementos da recomendação do W3C para processamento e sintaxe de assinatura XML:

  • Todos os elementos principais de sintaxe de assinatura (seção 4 do documento de recomendação do W3C), exceto o elemento KeyInfo, que não é totalmente suportado.

  • O elemento KeyInfo deve conter somente um elemento X509Data

  • Um elemento X509Data deve conter um elemento X509Certificate

  • O método de compilação SHA256

  • O algoritmo de assinatura RSA-SHA1 (PKCS1)

  • O Método e transformação de canonização "XML canônico sem comentários".

  • A transformação da assinatura envelopada

  • carimbos de data/hora

O documento a seguir ilustra uma assinatura XML típica (a maioria dos dados criptografados não foi removida para simplificar o exemplo):

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

Os elementos chave de uma assinatura são:

  • SignedInfo — Contém referências aos dados assinados e os valores de compilação computados no momento da assinatura. Os dados assinados podem ser incluídos no mesmo documento que a assinatura XML ou podem ser externos.

  • SignatureValue — Contém uma compilação do elemento SignedInfo criptografado com a chave privada de quem assina.

  • KeyInfo — Contém o certificado de assinatura, assim como certificados adicionais necessários para estabelecer a cadeia de confiança. Observe que, embora o elemento KeyInfo seja tecnicamente opcional, o AIR não pode validar a assinatura se ele não estiver incluído.

Há três tipos gerais de assinatura XML:

  • Envelopada - a assinatura é inserida nos dados XML que ela está assinando.

  • Envelopando - os dados XML assinados estão contidos em um elemento Object do elemento Signature.

  • Desanexada - os dados assinados são externos à assinatura XML. Os dados assinados podem estar em um arquivo externo. Como alternativa, podem estar no mesmo documento XML que a assinatura, mas não como um elemento pai ou filho do elemento Signature.

As assinaturas XML usam URIs para referenciar dados assinados. Os aplicativos de assinatura e validação devem usar as mesmas convenções para resolver essas URIs. Ao usar a classe XMLSignatureValidator, é necessário fornecer uma implementação da interface IURIDereferencer. Essa implementação é responsável por resolver a URI e retornar os dados assinados como objeto ByteArray. O objeto ByteArray retornado é compilado usando o mesmo algoritmo que produziu a compilação na assinatura.

Certificados e confiança

Um certificado consiste em uma chave pública, identificando informações e, possivelmente, um ou mais certificados que pertencem à autoridade de certificação emissora.

Há duas formas de estabelecer confiança em um certificado. Você pode estabelecer confiança obtendo uma cópia do certificado diretamente de quem assina, por exemplo, na mídia física, ou por meio de uma transmissão digital segura, como uma transação SSL. Você também pode contar com uma autoridade de certificação para determinar se o certificado de assinatura é confiável.

Para isso, o certificado de assinatura deve ser emitido por uma autoridade confiável no computador em que a assinatura é validada. A maioria dos fabricantes de sistemas operacionais insere os certificados raiz de várias autoridades de certificação no armazenamento confiável do sistema operacional. Os usuários também podem adicionar e remover certificados da armazenagem.

Mesmo se um certificado for emitido por uma autoridade de certificação confiável, você deve decidir se ele pertence a alguém em quem confia. Em muitos casos, essa decisão é transmitida ao usuário final. Por exemplo, quando um aplicativo do AIR é instalado, o instalador do AIR exibe as informações de identificação do certificado do editor ao solicitar ao usuário que verifique se deseja instalar o aplicativo. Em outros casos, pode ser necessário comparar a chave pública ou outras informações do certificado com uma lista de chaves aceitáveis. (Essa lista deve ser protegida, talvez por sua própria assinatura ou no armazenamento local criptografado do AIR, de forma que não seja possível adulterá-la).

Nota: Embora seja possível optar por confiar no certificado de assinatura sem verificação independente, como quando uma assinatura é "autoassinada", você não obtém muita segurança verificando a assinatura. Sem saber quem criou uma assinatura, a garantia de que ela não tenha sido adulterada é, no mínimo, sem valor. A assinatura pode ser uma falsificação assinada validamente.

Expiração e revogação do certificado

Todos os certificados expiram. Eles também podem ser revogados pela autoridade de certificação que o emitiram se, por exemplo, a chave privada relacionada ao certificado estiver comprometida ou tiver sido roubada. Se uma assinatura for executada com um certificado revogado ou expirado, será reportada como inválida, a menos que um carimbo de data e hora tenha sido incluído como parte dela. Se houver um carimbo de data e hora, a classe XMLSignatureValidator validará a assinatura desde que o certificado esteja válido no momento da assinatura.

Um carimbo de data e hora é uma mensagem digital assinada de um serviço de carimbo de data e hora de que os dados foram assinados em uma data e hora específicas. Eles são emitidos por autoridades de carimbo de data e hora e assinados pelo próprio certificado da autoridade do carimbo de data e hora. O certificado da autoridade de carimbo de data e hora incorporada no carimbo de data e hora deve ser confiável no computador atual para que o carimbo de data e hora seja considerado válido. O XMLSignatureValidator não fornece uma API para designar um certificado diferente para usar na validação do carimbo de data e hora.