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