Nozioni fondamentali sulla convalida delle firme XML

Adobe AIR 1.5 e versioni successive

Per una spiegazione rapida e codici di esempio di convalida delle firme XML, vedete i seguenti articoli delle Guide rapide in Centro per sviluppatori Adobe:

In Adobe® AIR® sono disponibili la classe XMLSignatureValidator e l'interfaccia IURIDereferencer per la convalida delle firme XML. La sintassi XML accettata dalla classe XMLSignatureValidator è un sottoinsieme della W3C Recommendation for XML Signature Syntax and Processing. (Poiché è supportato solo un sottoinsieme della Recommendation, non tutte le firme valide vengono convalidate). In AIR non è disponibile un'API per la creazione di firme XML.

Classi di convalida delle firme XML

Nell'API di convalida delle firme XML sono incluse le seguenti classi:

Pacchetto

Classi

flash.security

Le costanti di stringa XMLSignatureValidator sono definite nelle seguenti classi:

flash.events

Uso delle classi di convalida delle firme XML

Per usare la classe XMLSignatureValidator per convalidare una firma XML, è necessario effettuare le seguenti operazioni:

  • Creare un oggetto XMLSignatureValidator

  • Fornire un'implementazione dell'interfaccia IURIDereferencer. L'oggetto XMLSignatureValidator chiama il metodo dereference() di IURIDereferencer, passando l'URI per ogni riferimento presente in una firma. Il metodo dereference() deve risolvere l'URI e restituire i dati a cui si è fatto riferimento (che possono trovarsi nello stesso documento che contiene la firma o in una risorsa esterna).

  • Impostare l'attendibilità del certificato, la verifica delle revoche e le impostazioni di convalida dei riferimenti dell'oggetto XMLSignatureValidator, nel modo appropriato per l'applicazione in uso.

  • Aggiungere i listener di eventi per gli eventi complete ed error .

  • Chiamare il metodo verify() , passando la firma da convalidare.

  • Gestire gli eventi complete ed error e interpretate i risultati.

L'esempio riportato di seguito implementa una funzione validate() che verifica la validità di una firma XML. Le proprietà XMLSignatureValidator sono impostate in modo che il certificato di firma deve trovarsi nell'archivio delle fonti attendibili del sistema oppure sia concatenato a un certificato nell'archivio delle fonti attendibili. Nell'esempio si presuppone inoltre che sia presente una classe IURIDereferencer adeguata, denominata 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);                 
}

Processo di convalida delle firme XML

Quando chiamate il metodo verify() di XMLSignatureValidator, in AIR vengono eseguiti i seguenti passaggi:

  • Il runtime verifica dell'integrità crittografica della firma mediante la chiave pubblica del certificato di firma.

  • Il runtime stabilisce l'integrità crittografica, l'identità e l'attendibilità del certificato in base alle impostazioni correnti dell'oggetto XMLSignatureValidator.

    Il livello di attendibilità inserito nel certificato di firma è fondamentale per l'integrità del processo di convalida. La convalida della firma viene eseguita mediante un processo crittografico ben definito, tuttavia l'attendibilità del certificato di firma prevede un giudizio che non può essere effettuato mediante un algoritmo.

    In generale, sono disponibili tre modi per decidere se un certificato può essere considerato attendibile:

    • considerando attendibili autorità di certificazione e l'archivio fonti attendibili del sistema operativo;

    • ottenendo, direttamente dal firmatario, una copia del certificato, un altro certificato che serva come un ancoraggio di attendibilità per il certificato oppure informazioni sufficienti per identificare in maniera attendibile il certificato, ad esempio la chiave pubblica;

    • chiedendo all'utente finale dell'applicazione se ritiene attendibile il certificato. Questo tipo di richiesta non è valida con i certificati autofirmati, poiché le informazioni sull'identificazione contenute nel certificato sono intrinsecamente non attendibili.

  • Il runtime verifica l'integrità crittografica dei dati firmati.

    I dati firmati vengono verificati tramite l'implementazione di IURIDereferencer che avete eseguito. Per ogni riferimento nel documento della firma, viene chiamato il metodo dereference() dell'implementazione di IURIDereferencer. I dati restituiti dal metodo dereference() vengono usati per calcolare il digest dei riferimenti. Il valore di questo digest viene confrontato con il digest registrato nel documento della firma. Se i digest corrispondono, i dati non sono stati modificati dal momento della firma.

    Un'importante considerazione da tenere presente, quando si fa affidamento sui risultati della convalida di una firma XML, è che solo i dati firmati sono sicuri. Considerate ad esempio un manifesto firmato con l'elenco dei file contenuti in un pacchetto. Quando XMLSignatureValidator verifica la firma, controlla solo se il manifesti stesso è inalterato. I dati contenuti nei file non sono firmati, pertanto la firma viene convalidata anche se i file a cui viene fatto riferimento nel manifesto sono stati modificati o eliminati.

    Nota: per verificare i file in tale manifesto, potete calcolare il digest dei dati dei file (usando lo stesso algoritmo di hash usato nel manifesto) e confrontare il risultato con il digest memorizzato nel manifesto firmato. In alcuni casi, è opportuno verificare anche la presenza di file aggiuntivi.

Interpretazione dei risultati della convalida

I risultati della convalida vengono segnalati dalle proprietà di stato dell'oggetto XMLSignatureValidator. Queste proprietà possono essere lette dopo che l'oggetto validator ha inviato l'evento complete . Le quattro proprietà di stato includono: validityStatus , digestStatus , identityStatus e referencesStatus .

Proprietà validityStatus

La proprietà validityStatus segnala la validità complessiva della firma. La proprietà validityStatus dipende dallo stato delle altre tre proprietà di stato e può presentare uno dei seguenti valori:

  • valid - Se digestStatus , identityStatus e referencesStatus sono tutte valid .

  • invalid - Se lo stato di una o più proprietà di stato singole è invalid .

  • unknown — Se una o più proprietà di stato sono unknown e nessuno stato singolo è invalid .

Proprietà digestStatus

La proprietà digestStatus segnala i risultati della verifica crittografica del digest del messaggio. La proprietà digestStatus può presentare uno dei seguenti valori:

  • valid - Se il documento della firma risulta inalterato dall'apposizione della firma.

  • invalid — Se il documento di firma è stato modificato o il suo formato non è valido.

  • unknown - Se il metodo verify() non è stato completato senza errori.

Proprietà identityStatus

La proprietà identityStatus segnala lo stato del certificato di firma. Il valore di questa proprietà dipende da vari fattori, ad esempio:

  • integrità crittografica del certificato;

  • se il certificato è stato revocato o è scaduto;

  • se il certificato è considerato attendibile sul computer in uso;

  • lo stato dell'oggetto XMLSignatureValidator (ad esempio, se sono stati aggiunti ulteriori certificati per la creazione della catena di attendibilità, se tali certificati sono attendibili e i valori delle proprietà useSystemTrustStore e revocationCheckSettings ).

La proprietà identityStatus può presentare i seguenti valori:
  • valid - Per essere considerato valido, il certificato di firma deve rispettare le seguenti condizioni:

    • Il certificato di firma deve essere inalterato.

    • Il certificato di firma non deve essere scaduto o essere stato revocato, ad eccezione delle situazioni in cui nella firma è presente un indicatore di data e ora valido. Se la firma presenta un indicatore di data e ora, il certificato sarà considerato valido se era valido al momento della firma del documento (il certificato utilizzato dal servizio apposito per firmare l'indicatore di data e ora deve essere concatenato con un certificato principale attendibile nel computer dell'utente).

    • Il certificato di firma è attendibile. Un certificato è considerato attendibile quando è presente nell'archivio delle fonti attendibili del sistema oppure è concatenato a un altro certificato nell'archivio delle fonti attendibili e avete impostato la proprietà useSystemTrustStore su true. Potete anche designare un certificato come attendibile usando il metodo addCertificate() dell'oggetto XMLSignatureValidator.

    • Il certificato è, in effetti, il certificato di firma.

  • invalid - Il certificato è scaduto o è stato revocato e non è presente alcun indicatore di data e ora che ne provi la validità al momento della firma, oppure il certificato è stato modificato.

  • unknown - se il certificato non è valido, ma non è nemmeno attendibile. I certificati autofirmati, ad esempio, vengono segnalati come unknown (a meno che siano esplicitamente considerati attendibili). La proprietà identityStatus viene segnalata come unknown anche se il metodo verify() non è stato completato senza errori oppure se l'identità non è stata controllata poiché il digest della firma non è valido.

Proprietà referencesStatus

La proprietà referencesStatus segnala l'integrità crittografica dei riferimenti nell'elemento SignedData della firma.

  • valid - Se il digest calcolato per ogni riferimento nella firma è uguale al digest corrispondente registrato nella firma XML. Lo stato valid indica che i dati firmati non sono stati modificati.

  • invalid - Se qualsiasi digest calcolato non è uguale al digest corrispondente presente nella firma.

  • unknown - se i digest dei riferimenti non sono stati controllati. I riferimenti non vengono controllati se il digest complessivo della firma è invalid oppure se il certificato di firma non è valido. Se lo stato della proprietà identityStatus è unknown , i riferimenti vengono controllati solo quando referencesValidationSetting è validOrUnknown .