Grundlagen zur Validierung von XML-Signaturen

Adobe AIR 1.5 und höher

Eine Kurzbeschreibung und Codebeispiele zur Validierung von XML-Signaturen finden Sie in den folgenden Kurzanleitungen in der Adobe Developer Connection:

Adobe® AIR® stellt die XMLSignatureValidator-Klasse und die IURIDereferencer-Schnittstelle zum Validieren von XML-Signaturen zur Verfügung. Die von der XMLSignatureValidator-Klasse akzeptierte XML-Syntax ist ein Teilsatz der W3C-Empfehlung für die Syntax und Verarbeitung von XML-Signaturen. (Da nur ein Teilsatz der Empfehlung unterstützt wird, können nicht alle zulässigen Signaturen validiert werden.) AIR stellt keine API zum Erstellen von XML-Signaturen bereit.

Validierungsklassen für XML-Signaturen

Die Validierungs-API für XML-Signaturen enthält die folgenden Klassen:

Paket

Klassen

flash.security

XMLSignatureValidator-Stringkonstanten werden in den folgenden Klassen definiert:

flash.events

Verwendung der Validierungsklassen für XML-Signaturen

Sie müssen Folgendes ausführen, wenn Sie eine XML-Signatur mit der XMLSignatureValidator-Klasse validieren möchten:

  • Erstellen Sie ein XMLSignatureValidator-Objekt.

  • Stellen Sie eine Implementierung der IURIDereferencer-Schnittstelle bereit. Das XMLSignatureValidator-Objekt ruft die IURIDereferencer-Methode dereference() auf, wobei der URI für jeden Verweis in einer Signatur übergeben wird. Die dereference() -Methode muss den URI auflösen und die referenzierten Daten zurückgegeben (diese können sich in demselben Dokument wie die Signatur oder in einer externen Ressource befinden).

  • Legen Sie die Einstellungen für Zertifikatsvertrauenswürdigkeit, Sperrungsüberprüfung und Referenzvalidierung des XMLSignatureValidator-Objekt auf für Ihre Anwendung geeignete Werte fest.

  • Fügen Sie Ereignis-Listener für die complete - und error -Ereignisse hinzu.

  • Rufen Sie die verify() -Methode auf, wobei Sie die zu verifizierende Signatur übergeben.

  • Verarbeiten Sie die complete - und error -Ereignisse und interpretieren Sie die Ergebnisse.

Im folgenden Beispiel wird eine validate() -Funktion implementiert, die die Gültigkeit einer XML-Signatur überprüft. Die XMLSignatureValidator-Eigenschaften werden so eingestellt, dass das signierende Zertifikat sich im Vertrauensspeicher des Systems befinden muss, oder es muss eine Verknüpfung mit einem Zertifikat im Vertrauensspeicher bestehen. Im Beispiel wird davon ausgegangen, dass eine geeignete IURIDereferencer-Klasse mit dem Namen XMLDereferencer vorhanden ist.

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

Ablauf der XML-Signaturvalidierung

Wenn Sie die XMLSignatureValidator-Methode verify() aufrufen, führt AIR die folgenden Schritte aus:

  • Die Laufzeitumgebung überprüft die kryptografische Integrität der Signatur mithilfe des öffentlichen Schlüssels des signierenden Zertifikats.

  • Die Laufzeitumgebung stellt die kryptografische Integrität, Identität und Vertrauenswürdigkeit des Zertifikats anhand der aktuellen Einstellungen des XMLSignatureValidator-Objekts her.

    Das in das signierende Zertifikat gesetzte Vertrauen spielt eine wichtige Rolle für die Integrität des Validierungsprozesses. Die Signaturvalidierung wird mit einem gut definierten kryptografischen Prozess durchgeführt, die Vertrauenswürdigkeit des signierenden Zertifikats kann jedoch nicht algorithmisch beurteilt werden.

    Im Allgemeinen haben Sie drei Möglichkeiten, über die Vertrauenswürdigkeit eines Zertifikats zu entscheiden:

    • Sie verlassen sich auf die Zertifizierungsstellen und den Vertrauensspeicher des Betriebssystems.

    • Sie erhalten direkt von Signaturgeber eine Kopie des Zertifikats, ein anderes Zertifikat, das als eine Art Bürge für das Zertifikat dient, oder ausreichende Informationen, um das Zertifikat zuverlässig zu identifizieren, zum Beispiel den öffentlichen Schlüssel.

    • Sie fragen den Endbenutzer Ihrer Anwendung, ob er das Zertifikat für vertrauenswürdig hält. Eine solche Abfrage ist bei selbst signierten Zertifikaten ungültig, da die identifizierenden Informationen im Zertifikat an sich unzuverlässig sind.

  • Die Laufzeitumgebung überprüft die kryptografische Integrität der signierten Daten.

    Die signierten Daten werden mithilfe Ihrer IURIDereferencer-Implementierung überprüft. Für jeden Verweis im Signaturdokument wird die dereference() -Methode des IURIDereferencer-Objekts aufgerufen. Mit den von der dereference() -Methode zurückgegebenen Daten wird das Verweisdigest berechnet. Dieser Digestwert wird mit dem im Signaturdokument aufgezeichneten Digest verglichen. Wenn die Digests übereinstimmen, wurden die Daten seit dem Signieren nicht geändert.

    Wenn Sie sich auf die Ergebnisse der Validierung einer XML-Signatur verlassen, ist eine wichtige Überlegung, dass nur das, was signiert ist, sicher ist. Stellen Sie sich zum Beispiel ein signiertes Manifest vor, das die Dateien in einem Paket auflistet. Wenn der XMLSignatureValidator die Signatur verifiziert, wird nur überprüft, ob das Manifest selbst unverändert ist. Die Daten in den Dateien sind nicht signiert, weshalb die Signatur immer noch als valide erkannt wird, wenn die Dateien, auf die im Manifest verwiesen wird, geändert oder gelöscht wurden.

    Hinweis: Um die Dateien in einem derartigen Manifest zu überprüfen, können Sie den Digest der Dateidaten berechnen (mit demselben Hashing-Algorithmus, der im Manifest verwendet wird) und das Ergebnis mit dem im signierten Manifest gespeicherten Digest vergleichen. In bestimmten Fällen sollten Sie auch prüfen, ob zusätzliche Dateien vorhanden sind.

Interpretation der Validierungsergebnisse

Die Validierungsergebnisse werden von den Statuseigenschaften des XMLSignatureValidator-Objekts gemeldet. Diese Eigenschaften können gelesen werden, nachdem das Validatorobjekt das complete -Ereignis ausgelöst hat. Die vier Statuseigenschaften sind: validityStatus , digestStatus , identityStatus und referencesStatus .

Die validityStatus-Eigenschaft

Die validityStatus -Eigenschaft meldet die allgemeine Gültigkeit der Signatur. Die validityStatus -Eigenschaft ist von den anderen drei Statuseigenschaften abhängig und kann einen der folgenden Werte annehmen:

  • valid – Wenn digestStatus , identityStatus und referencesStatus alle den Wert valid aufweisen.

  • invalid – Wenn mindestens eine der einzelnen Statuseigenschaften den Wert invalid aufweist.

  • unknown – Wenn mindestens eine der einzelnen Statuseigenschaften den Wert unknown aufweist und keine einzelne Statuseigenschaft den Wert invalid aufweist.

Die digestStatus-Eigenschaft

Die digestStatus -Eigenschaft meldet die Ergebnisse der kryptografischen Überprüfung des Meldungsdigests. Die digestStatus -Eigenschaft kann einen der folgenden Werte annehmen:

  • valid – Wenn das Signaturdokument selbst seit dem Signieren nicht geändert wurde.

  • invalid – Wenn das Signaturdokument geändert wurde oder fehlerhaft strukturiert ist.

  • unknown – Wenn die verify() -Methode nicht ohne Fehler abgeschlossen wurde.

Die identityStatus-Eigenschaft

Die identityStatus -Eigenschaft meldet den Status des signierenden Zertifikats. Der Wert dieser Eigenschaft ist von verschiedenen Faktoren abhängig, darunter:

  • die kryptografische Integrität des Zertifikats

  • ob das Zertifikat abgelaufen oder gesperrt ist

  • ob das Zertifikat auf dem aktuellen Computer als vertrauenswürdig eingestuft wird

  • der Status des XMLSignatureValidator-Objekts (zum Beispiel ob weitere Zertifikate hinzugefügt wurden, um die Vertrauenskette aufzubauen, ob diese Zertifikate vertrauenswürdig sind, und die Werte der useSystemTrustStore - und revocationCheckSettings -Eigenschaften)

Die identityStatus -Eigenschaft kann die folgenden Werte annehmen:
  • valid – Um als gültig zu gelten, muss das signierende Zertifikat die folgenden Bedingungen erfüllen:

    • Das signierende Zertifikat darf nicht verändert worden sein.

    • Das signierende Zertifikat darf nicht abgelaufen oder gesperrt sein, es sei denn, es befindet sich ein gültiger Zeitstempel in der Signatur. Wenn die Signatur über einen Zeitstempel verfügt, gilt das Zertifikat als gültig, falls es zum Zeitpunkt des Signierens gültig war. (Das Zertifikat, das vom Zeitstempeldienst zum Signieren des Zeitstempels verwendet wird, muss mit einem vertrauenswürdigen Stammzertifikat auf dem Computer des Benutzers verkettet sein.)

    • Das signierende Zertifikat ist vertrauenswürdig. Ein Zertifikat wird als vertrauenswürdig eingestuft, wenn sich das Zertifikat im Vertrauensspeicher des Systems befindet oder mit einem anderen Zertifikat im Vertrauensspeicher des Systems verknüpft ist und Sie die useSystemTrustStore -Eigenschaft auf „true“ einstellen. Sie können ein Zertifikat auch als vertrauenswürdig einstufen, indem Sie die addCertificate() -Methode des XMLSignatureValidator-Objekts verwenden.

    • Das Zertifikat ist tatsächlich das signierende Zertifikat.

  • invalid – Das Zertifikat ist abgelaufen oder gesperrt (und es ist kein Zeitstempel vorhanden, der die Gültigkeit zum Zeitpunkt des Signierens bestätigt) oder das Zertifikat wurde geändert.

  • unknown – Wenn das Zertifikat zwar nicht ungültig, aber auch nicht vertrauenswürdig ist. Selbst signierte Zertifikate werden zum Beispiel als unknown gemeldet (sofern sie nicht ausdrücklich als vertrauenswürdig eingestuft sind). Die identityStatus -Eigenschaft bekommt auch dann den Wert unknown , wenn die verify() -Methode nicht ohne Fehler abgeschlossen wurde oder wenn die Identität nicht überprüft wurde, weil der Signaturdigest ungültig ist.

Die referencesStatus-Eigenschaft

Die referencesStatus -Eigenschaft meldet die kryptografische Integrität der Verweise im SignedData-Element der Signatur.

  • valid – Wenn der berechnete Digest aller Verweise in der Signatur mit dem entsprechenden in der XML-Signatur aufgezeichneten Digest übereinstimmt. Der Status valid gibt an, dass die signierten Daten nicht geändert wurden.

  • invalid – Wenn ein berechneter Digest nicht mit dem entsprechenden Digest in der Signatur übereinstimmt.

  • unknown – Wenn die Verweisdigests nicht überprüft wurden. Die Verweise werden nicht überprüft, wenn der allgemeine Signaturdigest den Wert invalid hat oder das signierende Zertifikat ungültig ist. Falls identityStatus den Wert unknown aufweist, werden die Verweise nur überprüft, wenn referencesValidationSetting den Wert validOrUnknown aufweist.