From 226d0817d9c63738059b376ce1eec92f247617d8 Mon Sep 17 00:00:00 2001 From: gregor Date: Tue, 10 Aug 2004 11:56:52 +0000 Subject: =?UTF-8?q?Zwischenstand:=20Weitere=20Beispiele=20hinzugef=C3=BCgt?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://joinup.ec.europa.eu/svn/moa-idspss/trunk@177 d688527b-c9ab-4aba-bd8d-4036d912da1d --- spss.handbook/handbook/usage/usage.html | 134 ++++++++++++++++++++++++++++++-- 1 file changed, 128 insertions(+), 6 deletions(-) (limited to 'spss.handbook') diff --git a/spss.handbook/handbook/usage/usage.html b/spss.handbook/handbook/usage/usage.html index a1fb9aa5b..3cea817f1 100644 --- a/spss.handbook/handbook/usage/usage.html +++ b/spss.handbook/handbook/usage/usage.html @@ -28,8 +28,10 @@
  • XML-Requests
    1. Erstellung einer XML-Signatur
      1. Einfaches Beispiel
      2. -
      3. Angabe der zu signierenden Daten
      4. -
      +
    2. Angabe der zu signierenden Daten
    3. +
    4. Transformationen
    5. +
    6. Ergänzungsobjekte
    7. +
  • Prüfung einer CMS-Signatur
  • Prüfung einer XML-Signatur @@ -55,6 +57,7 @@

    1 Übersicht

    Die Module Signaturprüfung (SP) und Serversignatur (SS) sind als plattformunabhängige Module ausgelegt, die entweder als Webservice über HTTP bzw. HTTPS oder als Klassenbibliothek über ein API angesprochen werden können. Dieses Handbuch beschreibt die Anwendung der beiden Module auf jede dieser beiden Arten.

    +

    TODO: Referenzierte Daten

    2 Verwendung des Webservices

    Dieser Abschnitt beschreibt die Verwendung der Module SP und SS über die Webservice-Schnittstelle. Im ersten Unterabschnitt werden typische XML-Requests zur Signaturerstellung mittels SS bzw. zur Signaturprüfung mittels SP vorgestellt, wie sie an das Webservice gesendet werden können. Der zweite Unterabschnitt stellt beispielhafte Implementierungen eines Webservice-Clients in Java vor.

    2.1 XML-Requests

    @@ -85,7 +88,7 @@ </CreateTransformsInfoProfile> Zu jedem Daten-Objekt können optional Transformationen (z.B. XPath, XSLT, Base64-Decodierung, etc.) angegeben werden. Werden - wie hier im Beispiel - keine Transformationen angegeben, so muss zumindest der MIME-Type der zu signierenden Daten spezifiziert werden.

    Response
    -

    CreateXMLSignatureRequest.Simple.resp.xml ist eine typische Response des SS Webservice auf den obigen Request. Sein Aufbau wird nachfolgend analysiert. Bitte beachten Sie, dass der die oben dargestellte Response zur bessernen Lesbarkeit eingerückt und gekürzt wurde.

    +

    CreateXMLSignatureRequest.Simple.resp.xml ist eine typische Response des SS Webservice auf den obigen Request. Sein Aufbau wird nachfolgend analysiert. Bitte beachten Sie, dass der die oben dargestellte Response zur bessernen Lesbarkeit eingerückt und gekürzt wurde.

    <CreateXMLSignatureResponse
       xmlns="http://reference.e-government.gv.at/namespace/moa/20020822#" 
    xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    <SignatureEnvironment>
    <dsig:Signature Id="signature-1-1" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    <dsig:SignedInfo> @@ -100,10 +103,10 @@ </dsig:Signature>
    </SignatureEnvironment>
    </CreateXMLSignatureResponse>

    CreateXMLSignatureResponse enthält je erzeugter Signatur ein Element SignatureEnvironment (in diesem Fall genau ein Element). SignatureEnvironment enthält die von SS erzeugte XML-Signatur, die im obigen Request spezifiziert wurde. Man erkennt, dass die XML-Signatur genau ein Daten-Objekt unterzeichnet (ein dsig:Reference Element ist enthalten). Das unterzeichnete Datenobjekt ist in der Signaturstruktur selbst enthalten (enveloping), und zwar in einem dsig:Object Element.

    -

    2.1.1.1 Angabe der zu signierenden Daten

    +

    2.1.1.2 Angabe der zu signierenden Daten

    Request

    Dieses Beispiel stellt die vielfältigen Möglichkeiten vor, wie MOA SS mitgeteilt werden kann, welche Daten signiert (wenn keine Transformationen angegeben werden) bzw. als Eingangsdaten für die Berechnung der Transformationen verwendet werden sollen (wenn Transformationen angegeben werden).

    -

    Mit CreateXMLSignatureRequest.Refs.xml sollen insgesamt neun Datenobjekte signiert werden:

    +

    Mit CreateXMLSignatureRequest.Refs.xml sollen insgesamt neun Datenobjekte signiert werden:

    <CreateXMLSignatureRequest 
       xmlns="http://reference.e-government.gv.at/namespace/moa/20020822#" 
       xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    <KeyIdentifier>KG_allgemein</KeyIdentifier>
    <SingleSignatureInfo SecurityLayerConformity="false">
    @@ -282,7 +285,7 @@ Ich habe weiters ein eigenens ID-Attribut bekommen.</doc:Paragraph>

    CreateSignatureEnvironment enthält das XML-Dokument, in das die zu erstellende Signatur integriert werden soll. In diesem Beispiel wird dieses Dokument mit Hilfe von LocRefContent referenziert, d. h. MOA SS wird versuchen, die darin enthaltene URL aufzulösen, um das XML-Dokument zu erhalten. Alternativ könnte auch Base64Content (explizite Angabe des XML-Dokuments in base64 kodierter Form) oder XMLContent (direkte Angabe des XML-Dokuments im Request) verwendet werden.

    CreateSignatureLocation enthält die Angabe jener Stelle, an der die Signatur in das XML-Dokument eingesetzt werden soll. Der Inhalt dieses Elements bezeichnet mittels XPath-Ausdruck das Parent-Element der Signatur, der Wert des Attributs CreateSignatureLocation/@Index enthält den Offset innerhalb dieses Parent-Elements. Betrachten Sie zur Verdeutlichung das XML-Dokument XMLDocument.xml, in das die Signatur integriert werden soll: Die Signatur soll unmittelbar nach dem zweiten doc:Paragraph Element in das XML-Dokument eingefügt werden. Der Inhalt von CreateSignatureLocation (/doc:XMLDocument) selektiert das zukünftige Parent-Element der Signatur, also doc:XMLDocument. Das Attribut Index enthält deshalb den Wert 4 (und nicht etwa 2 oder 3), da erstens bei 0 zu zählen begonnen wird, und zweitens auch die Text-Knoten, die lediglich Whitespace enthalten, für diesen Offset zählen (um diese Textknoten erkennen zu können, müssen Sie das XML-Dokument in einem Text-Editor öffnen). Beachten Sie weiters, dass das im XPath-Ausdruck verwendete Namespace-Prefix doc im Kontext des Elements CreateSignatureLocation bekannt sein muss. Deshalb enthält dieses Element auch die entsprechende Namespace-Deklaration (xmlns:doc="urn:document").

    Response
    -

    CreateXMLSignatureRequest.Refs.resp.xml ist eine typische Response des SS Webservice auf den obigen Request. Sein Aufbau wird nachfolgend analysiert. Bitte beachten Sie, dass der die oben dargestellte Response zur bessernen Lesbarkeit eingerückt und gekürzt wurde.

    +

    CreateXMLSignatureRequest.Refs.resp.xml ist eine typische Response des SS Webservice auf den obigen Request. Sein Aufbau wird nachfolgend analysiert. Bitte beachten Sie, dass der die oben dargestellte Response zur bessernen Lesbarkeit eingerückt und gekürzt wurde.

     <CreateXMLSignatureResponse 
       xmlns="http://reference.e-government.gv.at/namespace/moa/20020822#" 
    @@ -398,5 +401,124 @@ Ich habe weiters ein eigenens ID-Attribut bekommen.</doc:Paragraph>
             </dsig:Object>
     

    Das fünfte dsig:Object enthält das dsig:Manifest, das von MOA SS auf Grund des ersten bzw. fünften DataObjectInfo des Requests erstellt wurde. Darin enthalten sind die zum ersten und fünten DataObjectInfo korrespondierenden dsig:Reference Elemente. Die Daten für die erste im dsig:Manifest enthaltene dsig:Reference wurden aus dem Base64Content Element des ersten DataObjectInfo entnommen, jene für die zweite dsig:Reference aus dem Base64Content Element des fünften DataObjectInfo. Der Wert des URI Attributs der zweiten dsig:Reference wurde aus dem DataObject/@Reference des fünften DataObjectInfo übernommen.

    +

    2.1.1.3 Transformationen

    +
    Request
    +

    Dieses Beispiel (CreateXMLSignatureRequest.Transforms.xml) stellt die wichtigsten Transformationen vor, die von MOA SS bei der Erstellung einer Signatur verwendet werden können. Eine Transformation bzw. eine Kette mehrerer hintereinandergeschalteter Transformationen werden auf die Referenz-Eingangsdaten (also jene Daten, die in DataObjectInfo/DataObject angegeben werden) angewendet; das Ergebnis fließt dann in die Hashwert-Berechnung ein.

    +
    <CreateXMLSignatureRequest 
    +  xmlns="http://reference.e-government.gv.at/namespace/moa/20020822#" 
    +  xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    <KeyIdentifier>KG_allgemein</KeyIdentifier>
    <SingleSignatureInfo SecurityLayerConformity="false">
    +

    Die Signatur soll mit dem Schlüssel KG_allgemein erstellt werden; jene Elemente, die speziell für eine Security-Layer V1.1 konforme Signatur notwendig sind (vergleiche Einfaches Beispiel), brauchen nicht erstellt zu werden (SecurityLayerConformity="false").

    +
    +    <DataObjectInfo Structure="detached">
    +      <DataObject Reference="http://localhost:8080/referencedData/Text.b64"/>
    +      <CreateTransformsInfoProfile>
    +        <CreateTransformsInfo>
    +          <dsig:Transforms>
    +            <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#base64"/>
    +          </dsig:Transforms>
    +          <FinalDataMetaInfo>
    +            <MimeType>text/plain</MimeType>
    +          </FinalDataMetaInfo>
    +        </CreateTransformsInfo>
    +      </CreateTransformsInfoProfile>
    +    </DataObjectInfo>
    +
    +

    Für das erste zu signierende Datenobjekt werden die Referenz-Eingangsdaten mittels DataObject/@Reference referenziert, d. h. MOA SS löst die darin enthaltene URL auf, um zu den Daten zu gelangen. Es handelt sich dabei um einen base64 kodierten Text.

    +

    Unterschrieben werden soll nun aber nicht dieser base64 kodierte Text, sondern der entsprechend dekodierte Text. Dies lässt sich elegant durch die Angabe einer Base64 Decoding Transformation bewerkstelligen. Dazu wird als erstes Kindelement von CreateTransformsInfo ein dsig:Transforms Element im Request angegeben. Dieses dsig:Transforms Element nimmt ein oderer mehrere dsig:Transform Elemente auf, wobei jedes dsig:Transform Element für eine Transformation steht. In unserem Fall wird nur eine einzige Transformation benötigt; die Angabe, um welche Transformation es sich handelt, wird durch das Attribut dsig:Transform/@Algorithm angegeben. Für die Base64 Decoding Transformation muss der Wert auf http://www.w3.org/2000/09/xmldsig#base64 gesetzt werden. Sie ist eine parameterlose Transformation, d. h. dsig:Transform hat keine Kindelemente.

    +

    Der Mime-Type der zu signierenden Daten wird als text/plain angegeben, da ja tatsächlich nach der durchgeführten Transformation dekodierter Text vorliegt, über den dann der Hashwert berechnet wird.

    +
    +    <DataObjectInfo Structure="detached">
    +      <DataObject Reference="http://localhost:8080/referencedData/XMLDocument.xml"/>
    +      <CreateTransformsInfoProfile>
    +        <CreateTransformsInfo>
    +          <dsig:Transforms>
    +            <dsig:Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2">
    +              <xp2:XPath 
    +                xmlns:xp2="http://www.w3.org/2002/06/xmldsig-filter2" 
    +                xmlns:doc="urn:document" 
    +                Filter="subtract">/doc:XMLDocument/doc:Paragraph[2]</xp2:XPath>
    +            </dsig:Transform>
    +            <dsig:Transform Algorithm="http://www.w3.org/TR/1999/REC-xslt-19991116">
    +              <xsl:stylesheet version="1.0" 
    +                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:doc="urn:document">
    +  <xsl:output encoding="UTF-8" method="xml" indent="yes"/>
    +  <xsl:template match="/doc:XMLDocument">
    +    <html xmlns="http://www.w3.org/1999/xhtml">
    +      <head>
    +        <title>HTML-Dokument</title>
    +      </head>
    +      <body>
    +        <xsl:for-each select="doc:Paragraph">
    +          <p>
    +            <xsl:value-of select="child::text()"/>
    +          </p>
    +        </xsl:for-each>
    +      </body>
    +    </html>
    +  </xsl:template>
    +</xsl:stylesheet></dsig:Transform>
    +            <dsig:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
    +          </dsig:Transforms>
    +          <FinalDataMetaInfo>
    +            <MimeType>application/xhtml+xml</MimeType>
    +          </FinalDataMetaInfo>
    +        </CreateTransformsInfo>
    +      </CreateTransformsInfoProfile>
    +    </DataObjectInfo>
    +
    +

    Für das zweite zu signierende Datenobjekt werden die Referenz-Eingangsdaten wiederum mittels DataObject/@Reference referenziert, d. h. MOA SS löst die darin enthaltene URL auf, um zu den Daten zu gelangen. Es handelt sich dabei um ein XML-Dokument.

    +

    Zunächst soll von diesem XML-Dokument jedoch ein Teil weggeschnitten werden, da er nicht mitsigniert werden soll. Für diesen Zweck bietet sich die XPath Filter 2 Transformation an. Das Attribut dsig:Transform/@Algorithm ist dazu auf den Wert http://www.w3.org/2002/06/xmldsig-filter2 zu setzen. Diese Transformation benötigt weiters Transformationsparameter. Diese werden als Kindelement xp2:XPath in dsig:Transform angegeben. Das Attribut Filter selektiert den Filtermodus; für das Bespiel wird den Modus subtract benötigt, da ein Teil weggefiltert werden soll. Der Textinhalt von xp2:XPath ist ein XPath-Ausdruck, der den Wurzelknoten jenes Teilbaums selektiert, der weggefiltert werden soll. Für das Beispiel soll das zweite Paragraph Element des XML-Dokuments weggefiltert werden. Beachten Sie, dass das im XPath-Ausdruck verwendete Namespace-Prefix doc im Kontext des xp2:XPath Elements deklariert sein muss.

    +

    Als nächstes soll nun das XML-Dokument mit Hilfe eines Stylesheets in ein XHTML-Dokument übergeführt werden. Dazu kann die XSLT Transformation verwendet werden. Das Attribut dsig:Transform/@Algorithm ist dazu auf den Wert http://www.w3.org/TR/1999/REC-xslt-19991116 zu setzen. Auch diese Transformation benötigt Transformationsparameter: Als Kindelement von dsig:Transform wird jener Stylesheet angegeben, mit dem die Stylesheet-Transformation ausgeführt werden soll.

    +

    Abschließend soll, wie in der Spezifikation der XSLT-Transformation empfohlen, eine Kanonisierungstransformation angewendet werden. Damit können Unterschiede im Output unterschiedlicher XSLT-Engines, wie sie in der Praxis vorkommen, abgefangen werden. Beachten Sie, dass als Voraussetzung dazu die Output-Methode im Stylesheet auf xml festgelegt werden muss (<xsl:output method="xml">), denn nur XML-Output kann anschließend kanonisiert werden. Das Attribut dsig:Transform/@Algorithm ist für die Canonical XML Transformation auf den Wert http://www.w3.org/TR/2001/REC-xml-c14n-20010315 zu setzen. Die Transformation benötigt keine Transformationsparameter.

    +

    Das Ergebnis der drei hintereinandergeschalteten Transformationen, welches der Hashwert-Berechnung zufließt, finden Sie hier.

    +
    Response
    +

    CreateXMLSignatureRequest.Transforms.resp.xml ist eine typische Response des SS Webservice auf den obigen Request. Sein Aufbau wird nachfolgend analysiert. Bitte beachten Sie, dass der die oben dargestellte Response zur bessernen Lesbarkeit eingerückt und gekürzt wurde.

    +
    +<CreateXMLSignatureResponse 
    +  xmlns="http://reference.e-government.gv.at/namespace/moa/20020822#" 
    +  xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    +  <SignatureEnvironment>
    +    <dsig:Signature Id="signature-1-1" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
    +      <dsig:SignedInfo>
    +        <dsig:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
    +        <dsig:SignatureMethod Algorithm="http://www.buergerkarte.at/namespaces/ecdsa/200206030#ecdsa-sha1"/>
    +
    +

    Die Antwort enthält in SignatureEnvironment das Ergebnis der Signaturerstellung. Nachdem die Signatur in kein bestehendes Dokument eingefügt werden sollte, enhält SignatureEnvironment direkt die erzeugte XML-Signatur (dsig:Signature).

    +
    +        <dsig:Reference Id="reference-1-1" URI="http://localhost:8080/referencedData/Text.b64">
    +          <dsig:Transforms>
    +            <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#base64"/>
    +          </dsig:Transforms>
    +          <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
    +          <dsig:DigestValue>a53jOsL7KbyltpByAK87FoMZphI=</dsig:DigestValue>
    +        </dsig:Reference>
    +
    +

    Die erste dsig:Reference wurde auf Grund des ersten DataObjectInfo im Request erstellt. Man erkennt dass die URL auf die Referenz-Eingangsdaten (Wert des Attributs dsig:Reference/@URI) aus DataObject/@Reference übernommen und eine Base64 Decoding Transformation eingefügt würde. Die im Request spezifizierten Transformationen werden also eins zu eins in die XML-Signatur übernommen.

    +
    +        <dsig:Reference Id="reference-1-2" URI="http://localhost:8080/referencedData/XMLDocument.xml">
    +          <dsig:Transforms>
    +            <dsig:Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2">
    +              <xp2:XPath Filter="subtract" xmlns:doc="urn:document" 
    +                xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" 
    +                xmlns:xf2="http://www.w3.org/2002/06/xmldsig-filter2" 
    +                xmlns:xp2="http://www.w3.org/2002/06/xmldsig-filter2">/doc:XMLDocument/doc:Paragraph[2]</xp2:XPath>
    +            </dsig:Transform>
    +            <dsig:Transform Algorithm="http://www.w3.org/TR/1999/REC-xslt-19991116">
    +              <xsl:stylesheet version="1.0" 
    +                xmlns:doc="urn:document" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    +                <xsl:output encoding="UTF-8" indent="yes" method="xml"/>
    +                <xsl:template match="/doc:XMLDocument">...</xsl:template>
    +              </xsl:stylesheet>
    +            </dsig:Transform>
    +            <dsig:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
    +          </dsig:Transforms>
    +          <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
    +          <dsig:DigestValue>fIPwneCpjVqTXwHMN9DFfx6tJIU=</dsig:DigestValue>
    +        </dsig:Reference>
    +
    +

    Die zweite dsig:Reference wurde auf Grund des zweiten DataObjectInfo im Request erstellt. Man erkennt auch hier gut, dass die URL auf die Referenz-Eingangsdaten (Wert des Attributs dsig:Reference/@URI) aus DataObject/@Reference übernommen und die drei Transformationen wie im Request angegeben eingefügt wurden.

    +

    2.1.1.4 Ergänzungsobjekte

    +
    Request
    +
    Response
    -- cgit v1.2.3