Pour obtenir une explication rapide de la validation des signatures XML, ainsi que des exemples de code correspondants, voir les articles de démarrage rapide suivants dans Adobe Developer Connection :
Adobe® AIR® fournit la classe XMLSignatureValidator et l’interface IURIDereferencer pour la validation des signatures XML. La syntaxe XML acceptée par la classe XMLSignatureValidator est un sous-ensemble de la recommandation du W3C portant sur la syntaxe et le traitement des signatures XML. (Comme seul un sous-ensemble de la recommandation est pris en charge, toutes les signatures valides ne peuvent pas être validées.) AIR ne fournit pas d’API capable de créer des signatures XML.
Classes de validation des signatures XML
L’API de validation des signatures XML comprend les classes suivantes :
Package
|
Classes
|
flash.security
|
Les constantes de chaîne XMLSignatureValidator sont définies dans les classes suivantes :
|
flash.events
|
|
Utilisation des classes de validation des signatures XML
Pour utiliser la classe XMLSignatureValidator pour valider une signature XML, vous devez :
-
Créer un objet XMLSignatureValidator
-
Fournir une implémentation de l’interface IURIDereferencer. L’objet XMLSignatureValidator appelle la méthode IURIDereferencer
dereference()
, en transmettant l’URI pour chaque référence présente dans une signature. La méthode
dereference()
doit résoudre l’URI et renvoyer les données référencées (situées dans le même document que la signature ou dans une ressource externe).
-
Définir les paramètres de certificat de confiance, de vérification de la révocation et de validation des références de l’objet XMLSignatureValidator selon les besoins de votre application.
-
Ajouter des écouteurs d’événement pour les événements
complete
et
error
.
-
Appeler la méthode
verify()
, en transmettant la signature à vérifier.
-
Traiter les événements
complete
et
error
et interpréter les résultats.
L’exemple suivant implémente une fonction
validate()
qui vérifie la validité d’une signature XML. Les propriétés XMLSignatureValidator sont définies de telle sorte que le certificat de signature doit être présent dans le magasin d’approbation du système, ou chaîné vers un certificat du magasin d’approbation. L’exemple suppose également l’existence d’une classe IURIDereferencer appropriée nommée
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);
}
Processus de validation des signatures XML
Lorsque vous appelez la méthode
verify()
de la classe XMLSignatureValidator, AIR procède comme suit :
-
Le moteur d’exécution vérifie l’intégrité cryptographique de la signature à l’aide de la clé publique du certificat.
-
Le moteur d’exécution établie l’intégrité cryptographique, l’identité et la véracité du certificat sur la base des paramètres actuels de l’objet XMLSignatureValidator.
La confiance accordée au certificat de signature est essentielle pour l’intégrité du processus de validation. La validation de la signature est effectuée via un processus cryptographique bien défini, mais la fiabilité du certificat de signature ne peut pas être assurée par un algorithme.
En général, trois méthodes permettent de savoir si un certificat est fiable :
-
S’appuyer sur des autorités de certification et sur le magasin d’approbations du système d’exploitation.
-
Obtenir directement du signataire une copie du certificat, un autre certificat jouant le rôle d’ancre de confiance pour le certificat ou des informations permettant d’identifier le certificat avec certitude, par exemple la clé publique.
-
Demander à l’utilisateur final de votre application s’il fait confiance au certificat. Une telle requête n’est pas valide pour les certificats auto-signés car les informations d’identification du certificat ne sont pas fiables par nature.
-
Le moteur d’exécution vérifie l’intégrité cryptographique des données signées.
Les données signées sont vérifiées à l’aide de votre implémentation d’IURIDereferencer. Pour chaque référence du document de signature, la méthode
dereference()
de l’implémentation d’IURIDereferencer est appelée. Les données renvoyées par la méthode
dereference()
sont utilisées pour calculer le digest de référence. La valeur du digest est comparée au digest enregistré dans le document de signature. Si les digests correspondent, les données n’ont pas été modifiées depuis leur signature.
Une considération importante lorsque l’on s’appuie sur les résultats de la validation d’une signature XML est que seul ce qui a été signé est sécurisé. Par exemple, prenons le cas de la liste signée des fichiers contenus dans un package. Lorsque XMLSignatureValidator vérifie la signature, l’opération s’assure uniquement que la liste elle-même n’a pas été modifiée. Les données des fichiers n’étant pas signées, la signature reste valide même si les fichiers référencés ont été modifiés ou supprimés.
Remarque :
pour vérifier les fichiers d’une telle liste, vous pouvez calculer le digest de leurs données (en utilisant le même algorithme de hachage que pour la liste) et comparer le résultat au digest stocké dans la liste signée. Dans certains cas, vous pouvez également vérifier la présence de fichiers supplémentaires.
Interprétation des résultats de la validation
Les résultats de la validation sont indiqués par les propriétés d’état de l’objet XMLSignatureValidator. Ces propriétés peuvent être lues après la distribution de l’événement
complete
par l’objet validateur. Les quatre propriétés d’état sont :
validityStatus
,
digestStatus
,
identityStatus
et
referencesStatus
.
Propriété validityStatus
La propriété
validityStatus
renvoie la validité générale de la signature. Cette propriété
validityStatus
dépend de l’état des trois autres propriétés d’état et peut prendre l’une des valeurs suivantes :
-
valid
: si les propriétés
digestStatus
,
identityStatus
et
referencesStatus
sont toutes
valid
.
-
invalid
: si l’une des propriétés d’état est
invalid
.
-
unknown
: si l’une des propriétés d’état est
unknown
et qu’aucun état individuel n’est
invalid
.
Propriété digestStatus
La propriété
digestStatus
renvoie le résultat de la vérification cryptographique du digest du message. Cette propriété
digestStatus
peut prendre l’une des valeurs suivantes :
-
valid
: si le document de signature lui-même n’a pas été modifié depuis la signature.
-
invalid
: si le document de signature a été modifié ou est incorrect.
-
unknown
: si la méthode
verify()
ne s’est pas terminée sans erreur.
Propriété identityStatus
La propriété
identityStatus
renvoie l’état du certificat de signature. La valeur de cette propriété dépend de plusieurs facteurs :
-
intégrité cryptographique du certificat ;
-
expiration ou révocation éventuelle du certificat ;
-
approbation du certificat sur l’ordinateur en cours ;
-
état de l’objet XMLSignatureValidator (par exemple, si des certificats supplémentaires ont été ajoutés pour définir la chaîne de confiance, si ces certificats sont approuvés, et valeurs des propriétés
useSystemTrustStore
et
revocationCheckSettings
).
La propriété
identityStatus
peut avoir l’une des valeurs suivantes :
-
valid
: pour être considéré comme valide, le certificat de signature doit répondre aux conditions suivantes :
-
Le certificat de signature ne doit pas avoir été modifié.
-
Le certificat de signature ne doit pas être arrivé à expiration ou avoir été révoqué, sauf si un horodatage valide est présent dans la signature. Dans ce dernier cas, le certificat est considéré comme valide pour autant qu’il l’ait été au moment de la signature du document. (Le certificat utilisé par le service d’horodatage pour signer l’horodatage doit être lié par une chaîne de certificats à un certificat racine de confiance sur l’ordinateur de l’utilisateur.)
-
Le certificat de signature est approuvé. Un certificat est approuvé lorsqu’il est situé dans le magasin d’approbation du système ou qu’il chaîne vers un autre certificat du magasin d’approbation et que la propriété
useSystemTrustStore
est définie sur true. Vous pouvez également désigner un certificat comme étant approuvé en utilisant la méthode
addCertificate()
de l’objet XMLSignatureValidator.
-
Le certificat est, en fait, le certificat de signature.
-
invalid
: le certificat est arrivé à expiration ou a été révoqué (et aucun horodatage n’assure sa validité au moment de la signature) ou le certificat a été modifié.
-
unknown
: si le certificat n’est pas invalide, mais qu’il n’est pas non plus approuvé. Les certificats auto-signés, par exemple, sont signalés comme
unknown
(sauf s’ils sont explicitement approuvés). La propriété
identityStatus
est également désignée comme
unknown
si la méthode
verify()
ne s’est pas terminée sans erreur ou si l’identité n’a pas été vérifiée parce que le digest de la signature n’est pas valide.
Propriété referencesStatus
La propriété
referencesStatus
renvoie l’intégrité cryptographique des références présentes dans l’élément SignedData de la signature.
-
valid
: si le digest calculé de chaque référence de la signature correspond au digest enregistré correspondant dans la signature XML. Un état
valid
indique que les données signées n’ont pas été modifiées.
-
invalid
: si l’un des digests calculés ne correspond pas au digest correspondant dans la signature.
-
unknown
: si les digests des références n’ont pas été vérifiés. Les références ne sont pas vérifiées si le digest général de la signature est
invalid
ou si le certificat de signature n’est pas valide. Si la propriété
identityStatus
est
unknown
, les références ne sont vérifiées que si la valeur de
referencesValidationSetting
est
validOrUnknown
.
|
|
|