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