Informazioni sulle firme XML

Adobe AIR 1.5 e versioni successive

Una firma XML è una firma digitale rappresentata nella sintassi XML. I dati in una firma XML possono essere usati per verificare che le informazioni firmate non sono state modificate dopo l'apposizione della firma. Inoltre, quando un certificato di firma viene emesso da un'autorità di certificazione attendibile, l'identità del firmatario può essere verificata tramite l'infrastruttura a chiave pubblica.

Una firma XML può essere applicata a qualsiasi tipo di dati digitali (in formato binario o XML). Le firme XML vengono solitamente usate per scopi come:

  • verificare se le risorse esterne o scaricate sono state modificate;

  • verificare che i messaggi provengano da una fonte conosciuta;

  • convalidare la licenza dell'applicazione o i privilegi di sottoscrizione.

Sintassi delle firme XML supportata

In AIR sono supportati i seguenti elementi della W3C Recommendation for XML Signature Syntax and Processing.

  • Tutti gli elementi principali della sintassi relativa alle firme (sezione 4 del documento W3C Recommendation), eccetto l'elemento KeyInfo che non è completamente supportato.

  • L'elemento KeyInfo deve contenere solo un elemento X509Data.

  • Un elemento X509Data deve contenere solo un elemento X509Certificate.

  • Metodo digest SHA256.

  • Algoritmo di firma RSA-SHA1 (PKCS1).

  • Algoritmo Canonicalization Method and Transform "Canonical XML without comments".

  • Trasformazione della firma di tipo enveloped.

  • Indicatori di data e ora.

Nel seguente documento è illustrata una tipica firma XML (la maggior parte dei dati crittografici è stata rimossa per semplificare l'esempio):

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

Gli elementi principali di una firma sono:

  • SignedInfo - Contiene i riferimenti ai dati firmati e i valori del digest calcolati al momento dell'apposizione della firma. Gli stessi dati firmati possono essere inclusi nel medesimo documento della firma XML o possono essere esterni.

  • SignatureValue - Contiene un digest dell'elemento SignedInfo crittografato con la chiave privata del firmatario.

  • KeyInfo - Contiene il certificato di firma, oltre agli eventuali certificati aggiuntivi necessari per stabilire la catena di attendibilità. Benché l'elemento KeyInfo sia tecnicamente opzionale, se non è incluso la firma non può essere convalidata in AIR.

Sono disponibili tre tipi generici di firme XML:

  • Enveloped - La firma viene inserita nei dati XML firmati.

  • Enveloping - I dati XML firmati sono contenuti in un elemento Object all'interno dell'elemento Signature.

  • Detached - I dati firmati sono esterni alla firma XML. I dati firmati possono trovarsi in un file esterno. In alternativa, possono trovarsi nelle stesso documento XML che contiene la firma, ma non un elemento principale o secondario dell'elemento Signature.

Le firme XML usano degli URI per fare riferimento ai dati firmati. Nelle applicazioni di apposizione della firma e convalida devono essere usate le stesse convenzioni per risolvere questi URI. Quando usate la classe XMLSignatureValidator, dovete fornire un'implementazione dell'interfaccia IURIDereferencer. Questa implementazione si occupa della risoluzione dell'URI e della restituzione dei dati firmati come un oggetto ByteArray. Il digest dell'oggetto ByteArray restituito viene verificato usando lo stesso algoritmo che ha prodotto il digest nella firma.

Certificati e fonti attendibili

Un certificato è costituito da una chiave pubblica, da informazioni di identificazione ed eventualmente da uno o più certificati appartenenti all'autorità di certificazione emittente.

Per definire l'attendibilità in un certificato, sono disponibili due metodi. Potete stabilire l'attendibilità ottenendo una copia del certificato direttamente dal firmatario, ad esempio su un supporto fisico o tramite una trasmissione digitale protetta, quale una transazione SSL. Potete anche fare affidamento su un'autorità di certificazione per determinare se il certificato di firma è attendibile.

A questo scopo, il certificato di firma deve essere emesso da un'autorità considerata attendibile sul computer in cui la firma viene convalidata. Quasi tutti i produttori di sistemi operativi inseriscono i certificati principali di alcune autorità di certificazione nell'archivio delle fonti attendibili del sistema operativo. Gli utenti possono anche aggiungere o rimuovere i certificati da tale archivio.

Anche se un certificato viene emesso da un'autorità di certificazione attendibile, dovete comunque stabilire se tale certificato appartiene a una fonte che voi considerate attendibile. In molti scenari, questa decisione viene lasciata all'utente finale. Quando ad esempio viene installata un'applicazione AIR, il programma di installazione di AIR visualizza le informazioni di identificazione dal certificato dell'editore quando chiede all'utente di confermare se desidera installare l'applicazione. In altri casi, potreste dover confrontare la chiave pubblica o altre informazioni del certificato con un elenco di chiavi accettabili. (L'elenco deve essere protetto, eventualmente mediante una propria firma o memorizzandolo nell'archivio locale crittografato di AIR, per evitare che l'elenco stesso venga manomesso).

Nota: mentre potete scegliere di considerare attendibile il certificato di firma senza una verifica indipendente, ad esempio nel caso di un certificato autofirmato, non ottenete in tal modo alcun tipo di assicurazione verificando la firma. Senza sapere che ha creato la firma, la certezza che non sia stata manipolata non è assolutamente di alcun valore. La firma potrebbe essere una contraffazione apparentemente valida.

Scadenza e revoca dei certificati

Tutti i certificati hanno una scadenza. I certificati possono inoltre essere revocati dall'autorità di certificazione emittente se, ad esempio, la chiave privata correlata al certificato è stata compromessa o rubata. Se una firma è accompagnata da un certificato scaduto o revocato, sarà segnalata come non valida a meno che, come parte della firma stessa, sia stato incluso un indicatore di data e ora. Se è presente un indicatore di data e ora, la classe XMLSignatureValidator convalida la firma, a condizione che il certificato fosse valido al momento dell'apposizione della firma.

Un indicatore di data e ora è un messaggio digitale firmato da un servizio apposito che certifica che i dati sono stati firmati in una determinata data e a una determinata ora. Gli indicatori di data e ora vengono emessi dalle autorità preposte e firmati con il certificato emesso dalla stessa autorità. Il certificato dell'autorità di emissione degli indicatori di data e ora incorporato nell'indicatore stesso deve essere considerato attendibile sul computer in uso, perché possa essere considerato valido. In XMLSignatureValidator non è disponibile un'API per designare un certificato diverso da usare nella convalida dell'indicatore di data e ora.