Über XML-Signaturen

Adobe AIR 1.5 und höher

Eine XML-Signatur ist eine digitale Signatur in der XML-Syntax. Mithilfe der Daten in einer XML-Signatur kann überprüft werden, ob die signierten Informationen seit dem Signieren geändert wurden. Wenn ein signierendes Zertifikat von einer vertrauenswürdigen Zertifizierungsstelle ausgegeben wurde, kann über die Public-Key-Infrastruktur (PKI) die Identität des Signaturgebenden verifiziert werden.

Eine XML-Signatur kann auf beliebige digitale Daten (im Binär- oder XML-Format) angewendet werden. Typische Verwendungszwecke für XML-Signaturen sind zum Beispiel:

  • Überprüfen, ob externe oder heruntergeladene Daten geändert wurden

  • Bestätigen, dass Meldungen aus einer bekannten Quelle stammen

  • Validieren von Anwendungslizenzen oder Abonnementberechtigungen

Unterstützte XML-Signatursyntax

AIR unterstützt die folgenden Elemente aus der W3C-Empfehlung für die Syntax und Verarbeitung von XML-Signaturen:

  • Alle Kernelemente der Signatursyntax (Abschnitt 4 der W3C-Empfehlung); nur das KeyInfo-Element wird nicht vollständig unterstützt

  • Das KeyInfo-Element darf nur ein X509Data-Element enthalten

  • Ein X509Data-Element darf nur ein X509Certificate-Element enthalten

  • Die SHA256-Digestmethode

  • Der RSA-SHA1-Signaturalgorithmus (PKCS1)

  • Die „Canonical XML without comments“-Kanonisierungsmethode und Transformation

  • Die umhüllte Signaturtransformation

  • Zeitstempel

Das folgende Beispiel veranschaulicht eine typische XML-Signatur (die meisten kryptografischen Daten wurden der Einfachheit halber entfernt):

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <SignedInfo> 
        <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> 
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
        <Reference URI="URI_to_signed_data"> 
            <Transforms> 
                <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>            </Transforms> 
            <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> 
            <DigestValue>uoo...vY=</DigestValue> 
        </Reference> 
    </SignedInfo> 
    <SignatureValue>Ked...w==</SignatureValue> 
    <KeyInfo> 
        <X509Data> 
            <X509Certificate>i7d...w==</X509Certificate> 
        </X509Data> 
    </KeyInfo> 
</Signature>

Die Hauptelemente einer Signatur sind:

  • SignedInfo – Enthält Verweise auf die signierten Daten und die berechneten Digestwerte zum Zeitpunkt des Signierens. Die signierten Daten können sich in demselben Dokument wie die XML-Signatur oder in einem externen Dokument befinden.

  • SignatureValue – Enthält ein Digest des SignedInfo-Elements, das mit dem privaten Schlüssel des Signaturgebers verschlüsselt wurde.

  • KeyInfo – Enthält das signierende Zertifikat sowie ggf. zusätzliche Zertifikate, um die Vertrauenskette aufzubauen. Beachten Sie, dass das KeyInfo-Element technisch zwar nicht erforderlich ist, AIR die Signatur bei seinem Fehlen jedoch nicht validieren kann.

Es gibt drei allgemeine XML-Signaturtypen:

  • Umhüllt – Die Signatur wird in die XML-Daten, die signiert werden, eingefügt.

  • Umhüllend – Die signierten XML-Daten sind in einem Object-Element innerhalb des Signature-Elements enthalten.

  • Getrennt – Die signierten Daten befinden sich außerhalb der XML-Signatur. Die signierten Daten können in einer externen Datei enthalten sein. Alternativ dazu können sie sich auch in demselben XML-Dokument wie die Signatur, aber nicht als über- oder untergeordnetes Element des Signature-Elements befindet.

XML-Signaturen verweisen mit URIs auf die signierten Daten. Die signierende und die validierende Anwendung müssen dieselben Konventionen zur Auflösung dieser URIs verwenden. Bei Verwendung der XMLSignatureValidator-Klasse müssen Sie eine Implementierung der IURIDereferencer-Schnittstelle bereitstellen. Diese Implementierung ist für die Auflösung der URIs und für die Rückgabe der signierten Daten als ByteArray-Objekt zuständig. Das zurückgegebene ByteArray-Objekt wird mit demselben Algorithmus verarbeitet, der den Digest in der Signatur produziert hat.

Zertifikate und Vertrauen

Ein Zertifikat besteht aus einem öffentlichen Schlüssel (Public Key) und ggf. einem oder mehreren Zertifikaten, die zu der ausgebenden Zertifizierungsstelle gehören.

Es gibt zwei Möglichkeiten, in einem Zertifikat Vertrauen herzustellen. Sie können eine Kopie des Zertifikats direkt vom Signaturgeber erhalten, zum Beispiel auf einem physischen Datenträger oder über eine sichere digitale Übertragung wie eine SSL-Transaktion. Sie können sich auch auf eine Zertifizierungsstelle verlassen, um festzustellen, ob das signierende Zertifikat vertrauenswürdig ist.

Damit Sie sich auf eine Zertifizierungsstelle verlassen können, muss das signierende Zertifikat von einer Zertifizierungsstelle ausgegeben worden sein, die auf dem Computer, auf dem die Signatur validiert wird, als vertrauenswürdig eingestuft wird. Die meisten Hersteller von Betriebssystemen platzieren die Stammzertifikate einer Anzahl von Zertifizierungsstellen im Vertrauensspeicher des Betriebssystems. Benutzer können diesem Speicher Zertifikate hinzufügen und sie daraus entfernen.

Auch wenn ein Zertifikat von einer vertrauenswürdigen Zertifizierungsstelle ausgegeben wurde, müssen Sie immer noch entscheiden, ob das Zertifikat jemandem gehört, dem Sie vertrauen. In vielen Fällen wird diese Entscheidung dem Endbenutzer überlassen. Wenn zum Beispiel eine AIR-Anwendung installiert wird, zeigt das AIR-Installationsprogramm die identifizierenden Informationen aus dem Zertifikat des Herausgebers an, wenn der Benutzer gefragt wird, ob die Anwendung installiert werden soll. In anderen Fällen müssen vielleicht die öffentlichen Schlüssel oder andere Zertifikatinformationen mit einer Liste akzeptierter Schlüssel verglichen werden. (Diese Liste muss gesichert sein, eventuell mit einer eigenen Signatur oder durch Speicherung im verschlüsselten lokalen Speicher von AIR, damit die Liste nicht ihrerseits manipuliert werden kann.)

Hinweis: Sie können sich zwar auch ohne unabhängige Verifizierung dafür entscheiden, dem signierenden Zertifikat zu vertrauen – beispielsweise bei selbst signierten Zertifikaten – dadurch ist in puncto Sicherheit jedoch nicht viel gewonnen. Solange Sie nicht wissen, wer die Signatur erstellt hat, hat die Versicherung, dass die Signatur nicht manipuliert wurden, nur einen sehr geringen Wert. Bei der Signatur könnte es sich um eine gültig signierte Fälschung handeln.

Gültigkeitsdauer und Sperre von Zertifikaten

Alle Zertifikat haben eine begrenzte Gültigkeitsdauer. Zertifikate können auch von der ausgebenden Zertifizierungsstelle gesperrt werden, zum Beispiel wenn der private Schlüssel des Zertifikats nicht mehr vertrauenswürdig ist oder gestohlen wurde. Wenn eine Signatur mit einem abgelaufenen oder gesperrten Zertifikat signiert ist, wird die Signatur als ungültig betrachtet, sofern nicht ein Zeitstempel als Teil der Signatur enthalten ist. Wenn ein Zeitstempel vorhanden ist, validiert die XMLSignatureValidator-Klasse die Signatur, falls das Zertifikat zum Zeitpunkt des Signierens gültig war.

Ein Zeitstempel ist eine signierte digitale Meldung von einem Zeitstempeldienst, der zertifiziert, dass die Daten zu einem bestimmten Zeitpunkt (Datum und Uhrzeit) signiert wurden. Zeitstempel werden von Zeitstempelstellen ausgegeben und durch das Zertifikat der Zeitstempelstelle signiert. Das in den Zeitstempel eingebettete Zertifikat der Zeitstempelstelle muss auf dem zurzeit verwendeten Computer als vertrauenswürdig gelten, damit der Zeitstempel als gültig anerkannt wird. Die XMLSignatureValidator-Klasse stellt keine API bereit, mit der ein anderes Zertifikat zur Verwendung bei der Zeitstempelvalidierung bestimmt wird.