Grunderna i XML-signaturvalidering

Adobe AIR 1.5 och senare

Följande snabbstartartiklar på Adobe Developer Connection innehåller korta förklaringar och kodexempel på hur du validerar XML-signaturer:

I Adobe® AIR® används XMLSignatureValidator-klassen och IURIDereferencer-gränssnittet för validering av XML-signaturer. XML-syntaxen som stöds av XMLSignatureValidator-klassen är en deluppsättning av W3C:s rekommendation för XML-signatursyntax och -bearbetning. (Eftersom bara en deluppsättning av rekommendationen stöds kan inte alla giltiga signaturer valideras.) AIR tillhandahåller inget API för att skapa XML-signaturer.

Klasser för XML-signaturvalidering

API:t för XML-signaturvalidering inkluderar följande klasser:

Paket

Klasser

flash.security

Strängkonstanter för XMLSignatureValidator definieras i följande klasser:

flash.events

Använda klasserna för XML-signaturvalidering

Om du vill validera en XML-signatur med hjälp av XMLSignatureValidator-klassen måste du:

  • Skapa ett XMLSignatureValidator-objekt

  • Ange en implementering av IURIDereferencer-gränssnittet. XMLSignatureValidator-objektet anropar dereference() -metoden för IURIDereferencer och skickar URI:n för varje referens i en signatur. dereference() -metoden måste matcha URI:n och returnera refererade data (som kan finnas i samma dokument som signaturen, eller i en extern resurs).

  • Ange inställningarna för certifikatförtroende, återkallningskontroll och referensvalidering för XMLSignatureValidator-objektet så som det passar ditt program.

  • Lägg till händelseavlyssnare för händelserna complete och error .

  • Anropa verify() -metoden och ange den signatur som ska valideras.

  • Hantera händelserna complete och error och tolka resultatet.

Med följande exempel implementeras en validate() -funktion som verifierar en XML-signaturs giltighet. XMLSignatureValidator-egenskaperna definieras så att signeringscertifikatet måste finnas i systemets förtroendearkiv eller kopplas via en kedja till ett certifikat i förtroendearkivet. Exemplet förutsätter också att det finns en lämplig IURIDereferencer-klass med namnet 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);                 
}

XML-signaturvalideringsprocessen

När du anropar verify() -metoden i XMLSignatureValidator, utför AIR följande steg:

  • Runtime-modulen verifierar signaturens kryptografiska integritet med signeringscertifikatets offentliga nyckel.

  • Runtime-modulen fastställer certifikatets kryptografiska integritet, identitet och förtroendenivå baserat på XMLSignatureValidator-objektets aktuella inställningar.

    Det förtroende som signeringscertifikatet tilldelats är avgörande för valideringsprocessens integritet. Signaturvalideringen utförs med en väldefinierad kryptografisk process, men förtroendet för signeringscertifikatet är en bedömning som inte kan göras på algoritmisk väg.

    Vanligtvis kan du avgöra om ett certifikat är tillförlitligt på tre olika sätt:

    • Genom att förlita dig på certifikatutfärdare och operativsystemets förtroendearkiv.

    • Genom att, direkt från signeraren, få tillgång till en kopia av certifikatet, ett annat certifikat som fungerar som en förtroendebas för certifikatet eller tillräckligt med information för att på ett säkert sätt kunna identifiera certifikatet, t.ex. den offentliga nyckeln.

    • Genom att fråga programmets slutanvändare om de litar på certifikatet. Den här typen av fråga är inte giltig med självsignerade certifikat eftersom ID-informationen i certifikatet alltid betraktas som otillförlitlig.

  • Runtime-modulen verifierar den signerade informationens kryptografiska integritet.

    Den signerade informationen verifieras med hjälp av IURIDereferencer-implementeringen. För varje referens i signaturdokumentet anropas dereference() -metoden för IURIDereferencer-implementering. Data som returneras av dereference() -metoden används för att beräkna referenssammanfattningen. Det här sammanfattningsvärdet jämförs med sammanfattningen i signaturdokumentet. Om sammanfattningarna matchar varandra betyder det att informationen inte har modifierats sedan den signerades.

    Observera att endast det som signeras är säkert. Ett exempel är ett signerat manifest som specificerar filerna i ett paket. När XMLSignatureValidator verifierar signaturen kontrollerar objektet bara att själva manifestet inte har modifierats. Eftersom själva informationen i filerna inte är signerad kommer signaturen att valideras även om manifestet innehåller referenser till filer som har ändrats eller tagits bort.

    Obs! Om du vill verifiera filer i den här typen av manifest kan du beräkna sammanfattningen för filinformationen (med samma hash-algoritm som använts i manifestet) och jämföra resultatet med sammanfattningen i det signerade manifestet. I vissa fall bör du också kontrollera om det finns ytterligare filer.

Tolka valideringsresultatet

Valideringsresultatet rapporteras av XMLSignatureValidator-objektets statusegenskaper. Dessa egenskaper kan läsas när validator-objektet har skickat complete -händelsen. De fyra statusegenskaperna är: validityStatus , digestStatus , identityStatus och referencesStatus .

Egenskapen validityStatus

Egenskapen validityStatus visar signaturens allmänna giltighet. validityStatus beror på de övriga tre egenskapernas status och kan ha något av följande värden:

  • valid – Om digestStatus , identityStatus och referencesStatus är valid .

  • invalid – Om en eller flera av de enskilda statusegenskaperna är invalid .

  • unknown – Om en eller flera av de enskilda statusegenskaperna är unknown och ingen enskild status är invalid .

Egenskapen digestStatus

Egenskapen digestStatus visar resultatet från den kryptografiska verifieringen av meddelandesammanfattningen. Egenskapen digestStatus kan ha något av följande värden:

  • valid – Om själva signaturdokumentet inte har ändrats sedan signeringen.

  • invalid – Om det signaturdokumentet har ändrats eller har fel format.

  • unknown – Om metoden verify() inte har slutförts utan fel.

Egenskapen identityStatus

Egenskapen identityStatus visar signeringscertifikatets status. Den här egenskapens värde beror på flera faktorer, t.ex.:

  • certifikatets kryptografiska integritet

  • om certifikatet har gått ut eller återkallats

  • om certifikatet betraktas som tillförlitligt på den aktuella datorn.

  • XMLSignatureValidator-objektets status (t.ex. om ytterligare certifikat har lagts till för att skapa förtroendekedjan, om dessa certifikat betraktas som tillförlitliga och värdena för egenskaperna useSystemTrustStore och revocationCheckSettings )

Egenskapen identityStatus kan ha följande värden:
  • valid – Signeringscertifikatet måste uppfylla följande villkor för att betraktas som giltigt:

    • Signeringscertifikatet måste vara omodifierat.

    • Signaturcertifikatet får inte ha förfallit eller återkallats, med undantag för när en giltig tidsstämpel finns i signaturen. Om signaturen är tidsstämplad anses certifikatet vara giltigt om det var giltigt vid tidpunkten då dokumentet signerades. (Certifikatet som används av tidsstämpeltjänsten för att signera tidsstämpeln måste vara kopplat till ett betrott rotcertifikat på användarens dator.)

    • Signeringscertifikatet betraktas som tillförlitligt. Ett certifikat betraktas som tillförlitligt om certifikatet finns i datorns förtroendearkiv eller om det är kopplat via en kedja till ett annat certifikat i förtroendearkivet på datorn och egenskapen useSystemTrustStore har värdet true. Du kan också ange att ett certifikat är tillförlitligt med hjälp av XMLSignatureValidator-objektets addCertificate() -metod.

    • Certifikatet är i själva verket signeringscertifikatet.

  • invalid – Certifikatet har gått ut eller har återkallats (och det finns ingen tidsstämpel som bevisar certifikatets giltighet vid tidpunkten för signeringen) eller så har det modifierats.

  • unknown – Om certifikatet inte är ogiltigt, men inte heller betraktas som tillförlitligt. Självsignerade certifikat visas exempelvis som unknown (om de inte uttryckligen har angetts som tillförlitliga). identityStatus visas också som unknown om verify() -metoden inte har slutförts utan fel eller om identiteten inte har kontrollerats på grund av att signatursammanfattningen är ogiltig.

Egenskapen referencesStatus

Egenskapen referencesStatus visar den kryptografiska integriteten för referenserna i signaturens SignedData-element.

  • valid – Om den beräknade sammanfattningen för varje referens i signaturen matchar motsvarande sammanfattning i XML-signaturen. Statusen valid anger att den signerade informationen inte har modifierats.

  • invalid – Om en beräknad sammanfattning inte matchar motsvarande sammanfattning i signaturen.

  • unknown – Om referenssammanfattningarna inte har kontrollerats. Referenserna kontrolleras inte om den övergripande signatursammanfattningen är invalid eller om signeringscertifikatet är ogiltigt. Om identityStatus har värdet unknown kontrolleras bara referenserna om referencesValidationSetting har värdet validOrUnknown .