Basisbeginselen van de validatie van XML-handtekeningen

Adobe AIR 1.5 of hoger

Lees voor een snelle uitleg en codevoorbeelden van het valideren van XML-handtekeningen, de volgende snelstartartikelen in de Adobe Developer Connection:

Adobe® AIR® biedt de XMLSignatureValidator-klasse en de IURIDereferencer-interface voor het valideren van XML-handtekeningen. De XML-syntaxis die wordt geaccepteerd door de klasse XMLSignatureValidator is een subset van de W3C-aanbevelingen voor de syntaxis en verwerking van XML-handtekeningen. (Omdat alleen maar een subset van de aanbevelingen wordt ondersteund, kunnen niet alle geldige handtekeningen worden gevalideerd.) AIR is niet voorzien van een API voor het maken van XML-handtekeningen.

Klassen voor XML-handtekeningvalidatie

De API voor XML-handtekeningvalidatie is voorzien van de volgende klassen:

Pakket

Klassen

flash.security

Tekenreeksconstanten voor XMLSignatureValidator worden gedefinieerd in de volgende klassen:

flash.events

De klassen voor XML-handtekeningvalidatie gebruiken

Om de klasse XMLSignatureValidator te gebruiken om een XML-handtekening te valideren, moet u:

  • Een object XMLSignatureValidator maken

  • Een implementatie van de IURIDereferencer-interface bieden. Het object XMLSignatureValidator roept de methode dereference() van IURIDereferencer aan en geeft de URI voor iedere referentie in een handtekening door. De methode dereference() moet de URI oplossen en de gegevens waarnaar wordt verwezen, retourneren (deze kunnen zich bevinden in hetzelfde document als de handtekening of in een externe bron).

  • Geef de vertrouwensinstellingen voor certificaten, de instellingen voor de intrekkingscontrole van certificaten en de instellingen voor de validatie van referenties voor het XMLSignatureValidator-object op zoals u deze wilt gebruiken voor uw toepassing.

  • Voeg gebeurtenislisteners voor de gebeurtenissen complete en error toe.

  • Roep de methode verify() aan, en geef de te valideren handtekening door.

  • Handel de gebeurtenissen complete en error af en interpreteer de resultaten.

In het volgende voorbeeld wordt een functie validate() geïmplementeerd die de geldigheid van een XML-handtekening verifieert. De eigenschappen van XMLSignatureValidator zijn zodanig ingesteld dat het ondertekenende certificaat zich moet bevinden in de vertrouwde opslag van het systeem, of zijn gekoppeld aan een certificaat in de vertrouwde opslag. Er wordt verder in dit voorbeeld van uitgegaan dat een toepasselijke IURIDereferencer-klasse met de naam XMLDereferencer bestaat.

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);                 
}

Validatieproces van XML-handtekeningen

Wanneer u de XMLSignatureValidator-methode verify() aanroept, voert AIR de volgende stappen uit:

  • De runtime controleert de kryptografische integriteit van de handtekening met behulp van de openbare sleutel van het ondertekenende certificaat.

  • De runtime bevestigt de kryptografische integriteit, identiteit en betrouwbaarheid van het certificaat op basis van de huidige instellingen van het XMLSignatureValidator-object.

    Het vertrouwen dat wordt gegeven aan het ondertekenende certificaat is de sleutel voor de integriteit van het validatieproces. De handtekeningvalidatie wordt uitgevoerd aan de hand van een goedgedefinieerd cryptografisch proces, maar de betrouwbaarheid van het ondertekenende certificaat kan niet worden beoordeeld aan de hand van een algoritme.

    In het algemeen kunt u op drie manieren bepalen of een certificaat betrouwbaar is:

    • Door te vertrouwen op certificeringsinstanties en het vertrouwensarchief van het besturingssysteem.

    • U kunt bij de ondertekenaar een kopie van het certificaat opvragen, een ander certificaat dat fungeert als vertrouwensanker voor het certificaat, of voldoende informatie om het certificaat op betrouwbare wijze te kunnen identificeren, bijvoorbeeld de openbare sleutel.

    • U kunt de eindgebruikers van uw toepassing vragen of zij het certificaat vertrouwen. Zo'n vraag is ongeldig bij zelfondertekende certificaten, aangezien de identificerende informatie in dergelijke certificaten van nature onbetrouwbaar is.

  • De runtime controleert de kryptografische integriteit van de ondertekende gegevens.

    De ondertekende gegevens worden geverifieerd met behulp van uw IURIDereferencer-implementatie. Voor elke referentie in het handtekeningdocument wordt de methode dereference() van de IURIDereferencer-implementatie aangeroepen. De gegevens die de methode dereference() retourneert, worden gebruikt om de referentiesamenvatting te berekenen. De samenvattingswaarde wordt vergeleken met de samenvatting die in het handtekeningdocument is opgenomen. Als deze twee samenvattingen overeenstemmen, zijn de gegevens niet gewijzigd sinds ze werden ondertekend.

    Als u vertrouwt op de validatieresultaten van een XML-handtekening, moet u er wel rekening mee houden dat alleen datgene wat is ondertekend, ook veilig is. Neem bijvoorbeeld een ondertekend manifest waarin de bestanden in een pakket worden aangegeven. Wanneer de XMLSignatureValidator de handtekening verifieert, wordt alleen gecontroleerd of het manifest zelf ongewijzigd is. De gegevens in de bestanden zijn niet ondertekend; de handtekening zelf zal dus nog steeds worden gevalideerd, ook wanneer bestanden waarnaar wordt verwezen in het manifest, gewijzigd of verwijderd zijn.

    Opmerking: Om bestanden in zo'n manifest te verifiëren, kunt u de samenvatting van de bestandsgegevens berekenen (met gebruikmaking van hetzelfde hash-algoritme dat in het manifest is gebruikt) en het resultaat vergelijken met de samenvatting die is opgeslagen in het ondertekende manifest. In sommige gevallen moet u ook controleren op de aanwezigheid van extra bestanden.

Validatieresultaten interpreteren

De validatieresultaten worden gerapporteerd door de statuseigenschappen van het XMLSignatureValidator-object. Deze eigenschappen kunnen worden gelezen nadat het validator-object de gebeurtenis complete verzendt. De status kan een van de volgende vier waarden hebben: validityStatus , digestStatus , identityStatus en referencesStatus .

De eigenschap validityStatus

De eigenschap validityStatus rapporteert de algehele geldigheid van de handtekening. De validityStatus is afhankelijk van de toestand van de drie andere statuseigenschappen en kan een van de volgende waarden hebben:

  • valid — Als digestStatus , identityStatus en referencesStatus allemaal geldig zijn.

  • invalid — Als een of meer van de individuele statuseigenschappen ongeldig zijn.

  • unknown — Als een of meer afzonderlijke statuseigenschappen unknown is en geen enkele status invalid is.

De eigenschap digestStatus

De eigenschap digestStatus rapporteert de resultaten van de cryptografische verificatie van de berichtsamenvatting. De eigenschap digestStatus kan een van de volgende waarden hebben:

  • valid — Als het handtekeningdocument zelf sinds de ondertekening niet meer is gewijzigd.

  • invalid — Als het handtekeningdocument is gewijzigd of beschadigd.

  • unknown — Als de methode verify() niet is voltooid zonder fout.

De eigenschap identityStatus

De eigenschap identityStatus rapporteert de status van het ondertekenende certificaat. De waarde van deze eigenschap is afhankelijk van verschillende factoren, waaronder:

  • de cryptografische integriteit van het certificaat

  • is het certificaat verlopen dan wel ingetrokken

  • wordt het certificaat vertrouwd op de huidige computer

  • de status van het XMLSignatureValidator-object (bijvoorbeeld of er extra certificaten zijn toegevoegd voor het opbouwen van de vertrouwensketen, of die certificaten worden vertrouwd, en de waarden van de eigenschappen useSystemTrustStore en revocationCheckSettings )

De eigenschap identityStatus kan de volgende waarden hebben:
  • valid — Het ondertekenende certificaat kan alleen als geldig worden beschouwd als het voldoet aan de volgende voorwaarden:

    • Het ondertekenende certificaat moet ongewijzigd zijn.

    • Het ondertekenende certificaat mag niet zijn verlopen of ingetrokken, behalve wanneer de handtekening een geldige tijdstempel bevat. Als de handtekening een tijdstempel bevat, wordt het certificaat als geldig beschouwd als het geldig was op het moment dat het document werd ondertekend. (Het certificaat dat door de tijdstempelservice is gebruikt om het tijdstempel te plaatsen, moet zijn gekoppeld aan een vertrouwd basiscertificaat op de computer van de gebruiker.)

    • Het ondertekenende certificaat wordt vertrouwd. Het certificaat wordt vertrouwd als het certificaat zich bevindt in de vertrouwde opslag van het systeem of als het certificaat is gekoppeld aan een ander certificaat in de vertrouwde opslag van het systeem en u de eigenschappen useSystemTrustStore instelt op waar. U kunt ook een certificaat instellen als vertrouwd met de hulp van de methode addCertificate() van het XMLSignatureValidator-object.

    • Het certificaat moet werkelijk het ondertekenende certificaat zijn.

  • invalid — Het certificaat is verlopen of ingetrokken (en er is geen tijdstempel aanwezig die bewijst dat het certificaat geldig was toen het werd ondertekend), of het certificaat is gewijzigd.

  • unknown — Als het certificaat niet ongeldig is, maar ook niet wordt vertrouwd. Zelfondertekende certificaten worden bijvoorbeeld gerapporteerd als unknown (behalve als ze expliciet worden vertrouwd). De identityStatus wordt ook gerapporteerd als unknown als de methode verify() niet zonder fout is voltooid of als de identiteit niet is gecontroleerd omdat de samenvatting van de handtekening ongeldig is.

De eigenschap referencesStatus

De eigenschap referencesStatus rapporteert de cryptografische integriteit van de referenties in het SignedData-element van de handtekening.

  • valid — Als de berekende samenvatting van iedere referentie in de handtekening overeenkomt met de corresponderende samenvatting die is geregistreerd in de XML-handtekening. De status valid geeft aan dat de ondertekende gegevens niet zijn gewijzigd.

  • invalid — Als een berekende samenvatting niet overeenstemt met de corresponderende samenvatting in de handtekening.

  • unknown — Als de referentiesamenvattingen niet zijn gecontroleerd. De referenties worden niet gecontroleerd als de algehele handtekeningsamenvatting de waarde invalid heeft of als het ondertekenende certificaat ongeldig is. Als de identityStatus de waarde unknown heeft, worden de referenties alleen gecontroleerd wanneer referencesValidationSetting de waarde validOrUnknown heeft.