Bases de la validation des signatures XML

Adobe AIR 1.5 et les versions ultérieures

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 .