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