<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"> <title>Die österreichische Bürgerkarte - Einführung</title> <link rel="stylesheet" href="../common/MOA.css" type="text/css"> </head> <body bgcolor="white" text="#000000" link="#990000" vlink="#666666" alink="#cc9966"> <table class="logoTable" width="100%" border="0" cellspacing="0" cellpadding="10"> <tr> <td align="center" width="30%"><img src="../common/LogoBKA.png" width="267" height="36" alt="Logo BKA"></td> <td align="center" class="logoTitle"><div align="right">Open Source für das E-Government</div></td> </tr> </table> <hr/> <p class="title"><a href="../index.html">MOA: Serversignatur (SS) und Signaturprüfung (SP), V 1.2 </a></p> <p class="subtitle">Anwendung</p> <hr/> <h1>Inhalt</h1> <ol> <li> <p><a href="#übersicht">Übersicht</a></p> </li> <li> <p><a href="#webservice">Verwendung des Webservices</a></p> <ol> <li><a href="#webservice_xmlrequests">XML-Requests</a> <ol> <li><a href="#webservice_xmlrequests_erstellungxml">Erstellung einer XML-Signatur</a> <ol> <li><a href="#webservice_xmlrequests_erstellungxml_simple">Einfaches Beispiel</a></li> <li><a href="#webservice_xmlrequests_erstellungxml_daten">Angabe der zu signierenden Daten</a></li> <li><a href="#webservice_xmlrequests_erstellungxml_transformationen">Transformationen</a></li> <li><a href="#webservice_xmlrequests_erstellungxml_ergaenzungsobjekte">Ergänzungsobjekte</a> </li> </ol> </li> <li>Prüfung einer CMS-Signatur</li> <li>Prüfung einer XML-Signatur <ol> <li>Einfaches Beispiel</li> <li>Erweitertes Beispiel</li> </ol> </li> </ol> </li> <li>Webservice-Clients <ol> <li>Übersicht</li> <li>Gemeinsamkeiten</li> <li>Besonderheiten von HTTPSServerAuth</li> <li>Besonderheiten von HTTPSClientAuth</li> </ol> </li> </ol> </li> <li><a href="#klassenbibliothek">Verwendung der Klassenbibliothek</a></li> </ol> <hr/> <h1><a name="�bersicht" id="�bersicht"></a>1 Übersicht</h1> <p> 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.</p> <p class="comment">TODO: Referenzierte Daten </p> <h1><a name="webservice"></a>2 Verwendung des Webservices </h1> <p>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. </p> <h2><a name="webservice_xmlrequests" id="webservice_xmlrequests"></a>2.1 XML-Requests </h2> <p>Dieser Abschnitt stellt typische XML-Requests für die Erstellung einer XML-Signatur mittels SS bzw. zur Prüfung einer CMS- bzw. XML-Signatur mittels SP vor. Zu jedem Request wird jeweils auch eine typische Response des Services besprochen. </p> <h3><a name="webservice_xmlrequests_erstellungxml" id="webservice_xmlrequests_erstellungxml"></a>2.1.1 Erstellung einer XML-Signatur</h3> <h4><a name="webservice_xmlrequests_erstellungxml_simple" id="webservice_xmlrequests_erstellungxml_simple"></a>2.1.1.1 Einfaches Beispiel</h4> <h5>Request</h5> <p><code><a href="../../clients/webservice/resources/requests/CreateXMLSignatureRequest.Simple.xml" target="_blank">CreateXMLSignatureRequest.Simple.xml</a></code> ist ein einfacher XML-Request zur Erzeugung einer XML-Signatur. Sein Aufbau wird nachfolgend analysiert:</p> <pre> <KeyIdentifier>KG_allgemein</KeyIdentifier> </pre> <p><code>KG_allgemein</code> bezeichnet eine Schlüsselgruppe, aus der SS einen Signaturschlüssel selektieren soll und muss einer in der SP/SS-Konfigurationsdatei definierten Schlüsselgruppe entsprechen. </p> <pre> <SingleSignatureInfo SecurityLayerConformity="false"></pre> <p> Für jedes <code>SingleSignatureInfo</code>Element wird eine eigene XML-Signatur erzeugt. Wird das Attribut <code>SecurityLayerConformity</code> auf <code>true</code> gesetzt, dann wird eine XML-Signatur gemäß <a href="http://www.buergerkarte.at/konzept/securitylayer/spezifikation/20020831/core/Core.html#signaturerstellungNachXMLDSIGAntwort" target="_blank">Security-Layer Spezifikation V1.1 </a> erzeugt; d.h. es werden signierte Properties (Zeitpunkt der Signaturerstellung, das für die Signaturüberprüfung zu verwendende Zertifikat, Metainformationen zu den signierten Datenobjekten) und ein Manifest, das alle implizite Transformationsparameter enthält, zur Signatur hinzugefügt. </p> <pre> <DataObjectInfo Structure="enveloping"> <DataObject> <XMLContent>Diese Daten werden signiert.<XMLContent> </DataObject></pre> <p> </p> <p> Für jedes Daten-Objekt, das in die XML-Signatur als <code>dsig:Reference</code> aufgenommen werden soll, muss ein <code>DataObjectInfo</code> Element spezifiziert werden. Das Attribut <code>Structure</code> gibt an, ob die Daten in die Signatur in ein <code>dsig:Object</code> Element integriert werden sollen (<code>Structure="enveloping"</code>), oder über einen URL referenziert werden sollen (<code>Structure="detached"</code>). </p> <p> Im Fall von <code>Structure="enveloping"</code> muss im nachfolgenden <code>DataObject</code> Element entweder das Attribut <code>Reference</code> (enthält eine URL, von der SS die Daten beziehen soll) gesetzt sein, oder aber die zu signierenden Daten werden explizit in einem der Elemente <code>Base64Content</code> (enthält Daten in Base64 kodierter Form) oder <code>XMLContent</code> (enthält Daten als beliebiges XML-Fragment) oder <code>LocRefContent</code> (enthält eine URL, von der SS die Daten beziehen soll; in diesem Fall also gleichwertig wie ein gesetztes Attribut <code>Reference</code>) spezifiziert sein. Die Angabe der zu signierenden Daten über das Attribut <code>Reference</code> und gleichzeitig einem der Elemente <code>Base64Content</code> oder <code>XMLContent</code> oder <code>LocRefContent</code> ist nicht erlaubt.</p> <p>Im Fall von <code>Structure="detached"</code> muss das Attribut <code>Reference</code> im nachfolgenden <code>DataObject</code> Element gesetzt sein. Es enthält jene URL, die zur Referenzierung der Daten als Wert von <code>dsig:Reference/@URI</code> in die XML-Signatur aufgenommen wird. Die Angabe eines der Element <code>Base64Content</code> oder <code>XMLContent</code> oder <code>LocRefContent</code> ist optional. Unterbleibt die Angabe, bezieht SS die Daten von der URL im Attribut <code>Reference</code>. Wird eines der Elemente verwendet, bezieht SS die Daten durch Analyse des angegebenen Elements (siehe obiger Absatz). </p> <p>Im konkreten Beispiel sollen die Daten in ein <code>dsig:Object</code> Element integriert werden (<code>Structure="enveloping"</code>). Die Daten werden mittels <code>XMLContent</code> als XML-Fragment (ein einfacher Textknoten) angegeben.</p> <p> <pre> <CreateTransformsInfoProfile><br> <CreateTransformsInfo> <FinalDataMetaInfo> <MimeType>text/plain<MimeType> </FinalDataMetaInfo> </CreateTransformsInfo> </CreateTransformsInfoProfile></pre> 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. </p> <h5>Response</h5> <p><code><a href="../../clients/webservice/resources/requests/CreateXMLSignatureRequest.Simple.resp.xml" target="_blank">CreateXMLSignatureRequest.Simple.resp.xml</a></code> 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.</p> <p> <pre><CreateXMLSignatureResponse xmlns="http://reference.e-government.gv.at/namespace/moa/20020822#" <br> xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><br> <SignatureEnvironment><br> <dsig:Signature Id="signature-1-1" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><br> <dsig:SignedInfo> ... <dsig:Reference Id="reference-1-1" URI="#xpointer(id(&apos;signed-data-1-1-1&apos;)/node())"> ... </dsig:Reference> ... </dsig:SignedInfo> ... <dsig:Object Id="signed-data-1-1-1">Diese Daten werden signiert.</dsig:Object> </dsig:Signature><br> </SignatureEnvironment><br></CreateXMLSignatureResponse></pre> </p> <p><code>CreateXMLSignatureResponse</code> enthält je erzeugter Signatur ein Element <code>SignatureEnvironment</code> (in diesem Fall genau ein Element). <code>SignatureEnvironment</code> 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 <code>dsig:Reference</code> Element ist enthalten). Das unterzeichnete Datenobjekt ist in der Signaturstruktur selbst enthalten (<code>enveloping</code>), und zwar in einem <code>dsig:Object</code> Element. </p> <h4><a name="webservice_xmlrequests_erstellungxml_daten" id="webservice_xmlrequests_erstellungxml_daten"></a>2.1.1.2 Angabe der zu signierenden Daten </h4> <h5>Request</h5> <p>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).</p> <p>Mit <a href="../../clients/webservice/resources/requests/CreateXMLSignatureRequest.Refs.xml" target="_blank"><code>CreateXMLSignatureRequest.Refs.xml</code></a> sollen insgesamt neun Datenobjekte signiert werden:</p> <pre><CreateXMLSignatureRequest xmlns="http://reference.e-government.gv.at/namespace/moa/20020822#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><br> <KeyIdentifier>KG_allgemein</KeyIdentifier><br> <SingleSignatureInfo SecurityLayerConformity="false"></pre> <p>Die Signatur soll mit dem Schlüssel <code>KG_allgemein</code> erstellt werden; jene Elemente, die speziell für eine Security-Layer V1.1 konforme Signatur notwendig sind (vergleiche <a href="#webservice_xmlrequests_erstellungxml_simple" class="term">Einfaches Beispiel</a>), brauchen nicht erstellt zu werden (<code>SecurityLayerConformity="false"</code>).</p> <pre> <DataObjectInfo Structure="enveloping" ChildOfManifest="true"> <DataObject> <Base64Content>RGllc2UgRGF0ZW4gd2FyZW4gYmFzZTY0IGtvZGllcnQu</Base64Content> </DataObject> <CreateTransformsInfoProfile> <CreateTransformsInfo> <FinalDataMetaInfo> <MimeType>text/plain</MimeType> </FinalDataMetaInfo> </CreateTransformsInfo> </CreateTransformsInfoProfile> </DataObjectInfo></pre> <p>Die Daten sollen in der <span class="term">Enveloping</span> Form in die Signatur integriert werden, d. h. die Daten werden in einem <code>dsig:Object</code> als Teil der XML-Struktur der Signatur aufgenommen (<code>Structure="enveloping"</code>). Weiters sollen die Daten nicht über über eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code>, sondern über eine <code>dsig:Reference</code> in einem eigenen <code>dsig:Manifest</code> aufgenommen werden (<code>ChildOfManifest="true"</code>).</p> <p>Die Daten selbst werden explizit in base64 kodierter Form als Inhalt des Elements <code>Base64Content</code> angegeben. Das Attribut <code>DataObject/@Reference</code> darf nicht angegeben werden, da die Daten in der <span class="term">Enveloping</span> Form integriert werden sollen, und <code>Base64Content</code> verwendet wird.</p> <p>Es werden - wie in allen übrigen Fällen dieses Beispiels - keine Transformationen angegeben. Der Mime-Type der zu signierenden Daten wird als <code>text/plain</code> angegeben, da der Inhalt von <code>Base64Content</code> die base64-Kodierung des Texts <code>Diese Daten waren base64 kodiert.</code> ist. </p> <pre> <DataObjectInfo Structure="enveloping" ChildOfManifest="false"> <DataObject> <XMLContent><doc:XMLDocument xmlns:doc="urn:document"> <doc:Paragraph>Ich bin der erste Absatz in diesem Dokument.</doc:Paragraph> <doc:Paragraph ParaId="Para2">Und ich bin der zweite Absatz in diesem Dokument. Ich habe weiters ein eigenens ID-Attribut bekommen.</doc:Paragraph> </doc:XMLDocument></XMLContent> </DataObject> <CreateTransformsInfoProfile> <CreateTransformsInfo> <FinalDataMetaInfo> <MimeType>application/xml</MimeType> </FinalDataMetaInfo> </CreateTransformsInfo> </CreateTransformsInfoProfile> </DataObjectInfo> </pre> <p>Die Daten sollen in der <span class="term">Enveloping</span> Form in die Signatur integriert werden, d. h. die Daten werden in einem <code>dsig:Object</code> als Teil der XML-Struktur der Signatur aufgenommen (<code>Structure="enveloping"</code>). Diesmal sollen die Daten direkt über eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest="false"</code>).</p> <p>Die Daten selbst werden explizit als XML-Fragment als Inhalt des Elements <code>XMLContent</code> angegeben. Das Attribut <code>DataObject/@Reference</code> darf nicht angegeben werden, da die Daten in der <span class="term">Enveloping</span> Form integriert werden sollen, und <code>XMLContent</code> verwendet wird.</p> <p>Der Mime-Type der zu signierenden Daten wird als <code>application/xml</code> angegeben.</p> <pre> <DataObjectInfo Structure="enveloping" ChildOfManifest="false"> <DataObject Reference="http://localhost:8080/referencedData/Text.txt"/> <CreateTransformsInfoProfile> <CreateTransformsInfo> <FinalDataMetaInfo> <MimeType>text/plain</MimeType> </FinalDataMetaInfo> </CreateTransformsInfo> </CreateTransformsInfoProfile> </DataObjectInfo> </pre> <p>Die Daten sollen in der <span class="term">Enveloping</span> Form in die Signatur integriert werden, d. h. die Daten werden in einem <code>dsig:Object</code> als Teil der XML-Struktur der Signatur aufgenommen (<code>Structure="enveloping"</code>). Wiederum sollen die Daten direkt über eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest="false"</code>). </p> <p>Die Daten werden diesmal nicht explizit angegeben, sondern mittels der URL in <code>DataObject/@Reference</code> referenziert. MOA SS versucht diese URL aufzulösen, um zu den zu signierenden Daten zu gelangen. <code>Base64Content</code> oder <code>XMLContent</code> oder <code>LocRefContent</code> dürfen nicht verwendet werden, da die Daten in der <span class="term">Enveloping</span> Form integriert werden sollen, und bereits <code>DataObject/@Reference</code> eingesetzt wird. </p> <p>Der Mime-Type der zu signierenden Daten wird als <code>text/plain</code> angegeben.</p> <pre> <DataObjectInfo Structure="enveloping" ChildOfManifest="false"> <DataObject> <LocRefContent>http://localhost:8080/referencedData/Text.txt</LocRefContent> </DataObject> <CreateTransformsInfoProfile> <CreateTransformsInfo> <FinalDataMetaInfo> <MimeType>text/plain</MimeType> </FinalDataMetaInfo> </CreateTransformsInfo> </CreateTransformsInfoProfile> </DataObjectInfo> </pre> <p>Die Daten sollen wiederum in der <span class="term">Enveloping</span> Form in die Signatur integriert werden, d. h. die Daten werden in einem <code>dsig:Object</code> als Teil der XML-Struktur der Signatur aufgenommen (<code>Structure="enveloping"</code>). Wiederum sollen die Daten direkt über eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest="false"</code>). </p> <p>Die Daten werden wie im vorhergehenden Fall nicht explizit angegeben, sondern referenziert. Diesmal wird die URL jedoch nicht <code>DataObject/@Reference</code> verwendet, sondern als Textinhalt des Elements <code>LocRefContent</code> (<code>LocRef</code> steht für <span class="term">Location Reference</span>). <code>DataObject/@Reference</code> darf in diesem Fall nicht verwendet werden. Diese Methode ist semantisch völlig ident mit dem vorhergehenden Fall. </p> <p>Der Mime-Type der zu signierenden Daten wird als <code>text/plain</code> angegeben.</p> <pre> <DataObjectInfo Structure="detached" ChildOfManifest="true"> <DataObject Reference="http://localhost:8080/referencedData/Text.b64"> <Base64Content>RGllc2UgRGF0ZW4gd2FyZW4gYmFzZTY0IGtvZGllcnQu</Base64Content> </DataObject> <CreateTransformsInfoProfile> <CreateTransformsInfo> <FinalDataMetaInfo> <MimeType>text/plain</MimeType> </FinalDataMetaInfo> </CreateTransformsInfo> </CreateTransformsInfoProfile> </DataObjectInfo> </pre> <p>Die Daten sollen diesmal in der <span class="term">Detached</span> Form in die Signatur aufgenommen werden, d. h. die Daten werden nicht direkt in die Signaturstruktur integriert, sondern lediglich mittels URI im Attribut <code>URI</code> der anzufertigenden <code>dsig:Reference</code> referenziert (<code>Structure="detached"</code>). Die Daten sollen indirekt über eine <code>dsig:Reference</code> eines <code>dsig:Manifest</code>s aufgenommen werden (<code>ChildOfManifest="true"</code>). </p> <p>Die URI in <code>DataObject/@Reference</code> enthält dabei die URI, die zur Referenzierung in <code>dsig:Reference/@URI</code> aufgenommen werden soll. Die Daten selbst hingegen werden im diesem Beispiel explizit in base64 kodierter Form als Inhalt des Elements <code>Base64Content</code> angegeben. MOA SS löst also keine URL zur Erlangung der Daten auf, sondern verwendet den Inhalt von <code>Base64Content</code>. </p> <p>Der Mime-Type der zu signierenden Daten wird als <code>text/plain</code> angegeben.</p> <pre> <DataObjectInfo Structure="detached" ChildOfManifest="false"> <DataObject Reference="NichtAufloesbareReferenz1"> <XMLContent><doc:XMLDocument xmlns:doc="urn:document"> <doc:Paragraph>Ich bin der erste Absatz in diesem Dokument.</doc:Paragraph> <doc:Paragraph ParaId="Para2">Und ich bin der zweite Absatz in diesem Dokument. Ich habe weiters ein eigenens ID-Attribut bekommen.</doc:Paragraph> </doc:XMLDocument></XMLContent> </DataObject> <CreateTransformsInfoProfile> <CreateTransformsInfo> <FinalDataMetaInfo> <MimeType>application/xml</MimeType> </FinalDataMetaInfo> </CreateTransformsInfo> </CreateTransformsInfoProfile> </DataObjectInfo> </pre> <p>Die Daten sollen auch diesmal in der <span class="term">Detached</span> Form in die Signatur aufgenommen werden, d. h. die Daten werden nicht direkt in die Signaturstruktur integriert, sondern lediglich mittels URI im Attribut <code>URI</code> der anzufertigenden <code>dsig:Reference</code> referenziert (<code>Structure="detached"</code>). Diesmal sollen die Daten direkt über eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest="false"</code>). </p> <p>Die URI in <code>DataObject/@Reference</code> enthält dabei die URI, die zur Referenzierung in <code>dsig:Reference/@URI</code> aufgenommen werden soll. Die Daten selbst hingegen werden im diesem Beispiel explizit als XML-Fragment in <code>XMLContent</code> angegeben. MOA SS löst auch hier keine URL zur Erlangung der Daten auf, sondern verwendet den Inhalt von <code>XMLContent</code>. Zur Verdeutlichung dieses Umstandes wurde die URI in <code>DataObject/@Reference</code> auf einen Wert gesetzt, der von MOA SS ganz sicher nicht aufgelöst werden kann (<code>NichtAufloesbareReferenz1</code>). </p> <p>Der Mime-Type der zu signierenden Daten wird als <code>application/xml</code> angegeben.</p> <pre> <DataObjectInfo Structure="detached" ChildOfManifest="false"> <DataObject Reference="http://localhost:8080/referencedData/Text.txt"> </DataObject> <CreateTransformsInfoProfile> <CreateTransformsInfo> <FinalDataMetaInfo> <MimeType>text/plain</MimeType> </FinalDataMetaInfo> </CreateTransformsInfo> </CreateTransformsInfoProfile> </DataObjectInfo> </pre> <p>Wiederum sollen die Daten in der <span class="term">Detached</span> Form in die Signatur aufgenommen werden (<code>Structure="detached"</code>). Wie zuvor sollen die Daten direkt über eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest="false"</code>). </p> <p>Die URI in <code>DataObject/@Reference</code> enthält dabei die URI, die zur Referenzierung in <code>dsig:Reference/@URI</code> aufgenommen werden soll. Nachdem eine explizite Angabe der Daten mittels <code>Base64Content</code>, <code>XMLContent</code> oder <code>LocRefContent</code> unterbleibt, wird MOA SS versuchen, die URI in <code>dsig:Reference/@URI</code> als URL aufzulösen, um so zu den zu signierenden Daten zu gelangen. </p> <p>Der Mime-Type der zu signierenden Daten wird als <code>text/plain</code> angegeben.</p> <pre> <DataObjectInfo Structure="detached" ChildOfManifest="false"> <DataObject Reference="NichtAufloesbareReferenz2"> <LocRefContent>http://localhost:8080/referencedData/Text.txt</LocRefContent> </DataObject> <CreateTransformsInfoProfile> <CreateTransformsInfo> <FinalDataMetaInfo> <MimeType>text/plain</MimeType> </FinalDataMetaInfo> </CreateTransformsInfo> </CreateTransformsInfoProfile> </DataObjectInfo> </pre> <p>Wiederum sollen die Daten in der <span class="term">Detached</span> Form in die Signatur aufgenommen werden (<code>Structure="detached"</code>). Wie zuvor sollen die Daten direkt über eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest="false"</code>).</p> <p>Die URI in <code>DataObject/@Reference</code> enthält dabei die URI, die zur Referenzierung in <code>dsig:Reference/@URI</code> aufgenommen werden soll. Den Hinweis, wie MOA SS zu den zu signierenden Daten gelangen soll, ist jedoch in LocRefContent enthalten. MOA SS wird also versuchen, die dort enthaltene URL aufzulösen, um zu den zu signierenden Daten zu gelangen. Zur Verdeutlichung dieses Umstandes wurde die URI in <code>DataObject/@Reference</code> auf einen Wert gesetzt, der von MOA SS ganz sicher nicht aufgelöst werden kann (<code>NichtAufloesbareReferenz2</code>). Diese Art der Datenangabe kann eingesetzt werden, wenn die Daten zum Zeitpunkt der Signaturerstellung von einem anderen Ort bezogen werden müssen, als später dann bei der Signaturprüfung.</p> <p>Der Mime-Type der zu signierenden Daten wird als <code>text/plain</code> angegeben.</p> <pre> <DataObjectInfo Structure="detached" ChildOfManifest="false"> <DataObject Reference=""/> <CreateTransformsInfoProfile> <CreateTransformsInfo> <dsig:Transforms> <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> </dsig:Transforms> <FinalDataMetaInfo> <MimeType>application/xml</MimeType> </FinalDataMetaInfo> </CreateTransformsInfo> </CreateTransformsInfoProfile> </DataObjectInfo> </pre> <p>Im letzten Fall schließlich sollen wiederum Daten in der <span class="term">Detached</span> Form in die Signatur aufgenommen werden (<code>Structure="detached"</code>). Wie zuvor sollen die Daten direkt über eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest="false"</code>).</p> <p>Die Referenz auf die zu signierenden Daten ist wiederum in <code>DataObject/@Reference</code> enthalten; sie verweist diesmal jedoch nicht auf ein externes Dokument, sondern auf das gesamte (XML-)Dokument, in das die zu erstellende Signatur integriert werden soll, und zwar, indem <code>DataObject/@Reference</code> den leeren String (<code>""</code>) enthält. Nachdem dadurch zwangsläufig auch die Signatur in den zu signierenden Daten enthalten wäre, wird die Signatur durch die Angabe einer Enveloped Signature Transform aus den zu signierenden Daten herausgenommen, bevor darüber der Hashwert berechnet wird (dsig:Transform).</p> <p>Offen bleibt die Frage, wie MOA SS nun weiß, in welches (XML-)Dokument es die die Signatur integrieren soll. Siehe dazu die Erläuterungen zum nächsten Ausschnitts des Requests. </p> <p>Der Mime-Type der zu signierenden Daten wird als <code>application/xml</code> angegeben.</p> <pre> <CreateSignatureInfo> <CreateSignatureEnvironment> <LocRefContent>http://localhost:8080/referencedData/XMLDocument.xml</LocRefContent> </CreateSignatureEnvironment> <CreateSignatureEnvironmentProfile> <CreateSignatureLocation Index="4" xmlns:doc="urn:document">/doc:XMLDocument</CreateSignatureLocation> </CreateSignatureEnvironmentProfile> </CreateSignatureInfo> </pre> <p>Das Element <code>CreateSignatureInfo</code> ist grundsätzlich optional, und muss nur angegeben werden, wenn die zu erstellende Signatur von MOA SS in ein bestehendes XML-Dokument integriert werden soll (was in diesem Beispiel ja der Fall ist).</p> <p><code>CreateSignatureEnvironment</code> enthält das XML-Dokument, in das die zu erstellende Signatur integriert werden soll. In diesem Beispiel wird dieses Dokument mit Hilfe von <code>LocRefContent</code> referenziert, d. h. MOA SS wird versuchen, die darin enthaltene URL aufzulösen, um das XML-Dokument zu erhalten. Alternativ könnte auch <code>Base64Content</code> (explizite Angabe des XML-Dokuments in base64 kodierter Form) oder <code>XMLContent</code> (direkte Angabe des XML-Dokuments im Request) verwendet werden.</p> <p><code>CreateSignatureLocation</code> enthält die Angabe jener Stelle, an der die Signatur in das XML-Dokument eingesetzt werden soll. Der Inhalt dieses Elements bezeichnet mittels <span class="term">XPath</span>-Ausdruck das <span class="term">Parent</span>-Element der Signatur, der Wert des Attributs <code>CreateSignatureLocation/@Index</code> enthält den Offset innerhalb dieses <span class="term">Parent</span>-Elements. Betrachten Sie zur Verdeutlichung das XML-Dokument <a href="../../clients/common/referencedData/XMLDocument.xml" target="_blank"><code>XMLDocument.xml</code></a>, in das die Signatur integriert werden soll: Die Signatur soll unmittelbar nach dem zweiten <code>doc:Paragraph</code> Element in das XML-Dokument eingefügt werden. Der Inhalt von <code>CreateSignatureLocation</code> (<code>/doc:XMLDocument</code>) selektiert das zukünftige <span class="term">Parent</span>-Element der Signatur, also <code>doc:XMLDocument</code>. Das Attribut <code>Index</code> enthält deshalb den Wert <code>4</code> (und nicht etwa <code>2</code> oder <code>3</code>), da erstens bei <code>0</code> 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 <span class="term">XPath</span>-Ausdruck verwendete Namespace-Prefix <code>doc</code> im Kontext des Elements <code>CreateSignatureLocation</code> bekannt sein muss. Deshalb enthält dieses Element auch die entsprechende Namespace-Deklaration (<code>xmlns:doc="urn:document"</code>).</p> <h5>Response</h5> <p><code><a href="../../clients/webservice/resources/requests/CreateXMLSignatureRequest.Refs.resp.xml" target="_blank">CreateXMLSignatureRequest.Refs.resp.xml</a></code> 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.</p> <pre> <CreateXMLSignatureResponse xmlns="http://reference.e-government.gv.at/namespace/moa/20020822#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"> <SignatureEnvironment> <doc:XMLDocument xmlns:doc="urn:document"> <doc:Paragraph>Ich bin der erste Absatz in diesem Dokument.</doc:Paragraph> <doc:Paragraph ParaId="Para2">Und ich bin der zweite Absatz in diesem Dokument. Ich habe weiters ein eigenens ID-Attribut bekommen.</doc:Paragraph><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"/> </pre> <p>Die Antwort enthält in <code>SignatureEnvironment</code> das Ergebnis der Signaturerstellung. Nachdem die Signatur in ein bestehendes XML-Dokument integriert werden sollte, enthält <code>SignatureEnvironment</code> das Dokument-Element dieses XML-Dokuments (<code>doc:XMLDocument</code>). Man erkennt auch gut, dass die XML-Signatur als fünfter Kindknoten (Offset <code>4</code>) von <code>doc:XMLDocument</code> eingefügt wurde.</p> <pre> <dsig:Reference Id="reference-1-2" URI="#xpointer(id('signed-data-1-2-1')/node())"> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <dsig:DigestValue>A8ml6/aZKCmj1hONwvLItIwGHoc=</dsig:DigestValue> </dsig:Reference> </pre> <p>Diese <code>dsig:Reference</code> wurde auf Grund des zweiten <code>DataObjectInfo</code> Elements im Request erstellt. Man erkennt gut den Verweis in <code>dsig:Reference/@URI</code> auf das <code>dsig:Object</code>, das die signierten Daten enthält (der XPointer verweist auf sämtliche Kindknoten jenes Elements, das ein ID-Attribut mit dem Wert <code>signed-data-1-2-1</code> aufweist, des ersten vorkommenden <code>dsig:Object</code>s der Signatur). </p> <pre> <dsig:Reference Id="reference-1-3" URI="#xpointer(id('signed-data-1-3-1')/node())"> <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>0P878Dsmtxv5goj+6KgNmj6S/EE=</dsig:DigestValue> </dsig:Reference> </pre> <p>Diese <code>dsig:Reference</code> wurde auf Grund des dritten <code>DataObjectInfo</code> Elements im Request erstellt. Die Text-Daten wurden von der angegebenen URL (<code>http://localhost:8080/referencedData/Text.txt</code>) aufgelöst und in das <code>dsig:Object</code> mit dem ID-Attribut <code>signed-data-1-3-1</code> gesteckt. Um Probleme mit nicht in XML darstellbare Zeichen zu vermeiden, wurde der Text nicht direkt signiert, sondern in base64 kodierter Form in das <code>dsig:Object</code> integriert, und eine Transformation zur base64 Dekodierung spezifiziert. </p> <pre> <dsig:Reference Id="reference-1-4" URI="#xpointer(id('signed-data-1-4-1')/node())"> <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>0P878Dsmtxv5goj+6KgNmj6S/EE=</dsig:DigestValue> </dsig:Reference> </pre> <p>Diese <code>dsig:Reference</code> wurde auf Grund des vierten <code>DataObjectInfo</code> Elements im Request erstellt. Wie schon bei der Beschreibung des Requests angeführt, ist die erstellte<code> dsig:Reference</code> semantisch genau gleich wie die vorhergehende. </p> <pre> <dsig:Reference Id="reference-1-6" URI="NichtAufloesbareReferenz1"> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <dsig:DigestValue>2b83+NbXDFijHzz+sH0T7fM36sA=</dsig:DigestValue> </dsig:Reference> </pre> <p>Diese <code>dsig:Reference</code> wurde auf Grund des sechsten <code>DataObjectInfo</code> Elements im Request erstellt. Die zu signierenden Daten wurden aus dem <code>XMLContent</code> des Requests entnommen, als Wert von <code>dsig:Reference/@URI</code> wurde der Wert von <code>DataObjectInfo/@Reference</code> übernommen. </p> <pre> <dsig:Reference Id="reference-1-7" URI="http://localhost:8080/referencedData/Text.txt"> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <dsig:DigestValue>0P878Dsmtxv5goj+6KgNmj6S/EE=</dsig:DigestValue> </dsig:Reference> </pre> <p>Diese <code>dsig:Reference</code> wurde auf Grund des siebenten <code>DataObjectInfo</code> Elements im Request erstellt. Um zu den zu signierenden Daten zu gelangen, wurde von MOA SS die URL in <code>DataObjectInfo/@Reference</code> aufgelöst. Gleichermaßen wurde die URL in <code>dsig:Reference/@URI</code> übernommen. </p> <pre> <dsig:Reference Id="reference-1-8" URI="NichtAufloesbareReferenz2"> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <dsig:DigestValue>0P878Dsmtxv5goj+6KgNmj6S/EE=</dsig:DigestValue> </dsig:Reference> </pre> <p>Diese <code>dsig:Reference</code> wurde auf Grund des achten <code>DataObjectInfo</code> Elements im Request erstellt. Um zu den zu signierenden Daten zu gelangen, wurde von MOA SS die URL in LocRefContent aufgelöst. In <code>dsig:Reference/@URI</code> wurde der Wert aus <code>DataObjectInfo/@Reference</code> übernommen.</p> <pre> <dsig:Reference Id="reference-1-9" URI=""> <dsig:Transforms> <dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> </dsig:Transforms> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <dsig:DigestValue>2b83+NbXDFijHzz+sH0T7fM36sA=</dsig:DigestValue> </dsig:Reference> </pre> <p>Diese <code>dsig:Reference</code> wurde auf Grund des neunten <code>DataObjectInfo</code> Elements im Request erstellt. Als zu signierende Daten wurde das XML-Dokument ausgewählt, in das die XML-Signatur integriert werden solle. Vor der Berechnung des Hashwerts wurde eine <span class="term">Enveloped Signature</span> Transformation zwischengeschaltet, welche die XML-Struktur der Signatur selbst aus den Hash-Eingangsdaten herausschneidet. </p> <pre> <dsig:Reference Type="http://www.w3.org/2000/09/xmldsig#Manifest" URI="#dsig-manifest-1-1"> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <dsig:DigestValue>mNsxUkFoF46XZVBivBo4aasFCTQ=</dsig:DigestValue> </dsig:Reference> </pre> <p>Diese <code>dsig:Reference</code> verweist auf das <code>dsig:Manifest</code> weiter unten in der XML-Struktur der Signatur. Das <code>dsig:Manifest</code> wurde angelegt, weil bei zwei <code>DataObjectInfo</code>s im Request das Attribut <code>ChildOfManifest</code> auf den Wert <code>true</code> gesetzt wurde.</p> <pre> </dsig:SignedInfo> <dsig:SignatureValue>...</dsig:SignatureValue> <dsig:KeyInfo>...</dsig:KeyInfo> <dsig:Object Id="signed-data-1-2-1"> <doc:XMLDocument xmlns:doc="urn:document"> <doc:Paragraph>Ich bin der erste Absatz in diesem Dokument.</doc:Paragraph> <doc:Paragraph ParaId="Para2">Und ich bin der zweite Absatz in diesem Dokument. Ich habe weiters ein eigenens ID-Attribut bekommen.</doc:Paragraph> </doc:XMLDocument> </dsig:Object> <dsig:Object Id="signed-data-1-3-1">RGllc2UgRGF0ZW4gc2luZCByZWluZXIgVGV4dC4=</dsig:Object> <dsig:Object Id="signed-data-1-4-1">RGllc2UgRGF0ZW4gc2luZCByZWluZXIgVGV4dC4=</dsig:Object> <dsig:Object Id="signed-data-1-1-1">RGllc2UgRGF0ZW4gd2FyZW4gYmFzZTY0IGtvZGllcnQu</dsig:Object> </pre> <p><code>SignatureValue</code> und <code>KeyInfo</code> werden an dieser Stelle nicht näher betrachtet.</p> <p>Das erste <code>dsig:Object</code> enthält die Daten aus dem zweiten <code>DataObjectInfo</code>; das zweite <code>dsig:Object</code> jene aus dem dritten <code>DataObjectInfo</code>; das dritte <code>dsig:Object</code> jene aus dem vierten <code>DataObjectInfo</code>; das vierte <code>dsig:Object</code> schließlich jene aus dem ersten <code>DataObjectInfo</code>.</p> <pre> <dsig:Object> <dsig:Manifest Id="dsig-manifest-1-1"> <dsig:Reference Id="reference-1-1" URI="#xpointer(id('signed-data-1-1-1')/node())"> <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> <dsig:Reference Id="reference-1-5" URI="http://localhost:8080/referencedData/Text.b64"> <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> <dsig:DigestValue>a53jOsL7KbyltpByAK87FoMZphI=</dsig:DigestValue> </dsig:Reference> </dsig:Manifest> </dsig:Object> </pre> <p>Das fünfte <code>dsig:Object</code> enthält das <code>dsig:Manifest</code>, das von MOA SS auf Grund des ersten bzw. fünften <code>DataObjectInfo</code> des Requests erstellt wurde. Darin enthalten sind die zum ersten und fünten <code>DataObjectInfo</code> korrespondierenden <code>dsig:Reference</code> Elemente. Die Daten für die erste im <code>dsig:Manifest</code> enthaltene <code>dsig:Reference</code> wurden aus dem <code>Base64Content</code> Element des ersten <code>DataObjectInfo</code> entnommen, jene für die zweite <code>dsig:Reference</code> aus dem <code>Base64Content</code> Element des fünften <code>DataObjectInfo</code>. Der Wert des <code>URI</code> Attributs der zweiten <code>dsig:Reference</code> wurde aus dem <code>DataObject/@Reference</code> des fünften <code>DataObjectInfo</code> übernommen. </p> <h4><a name="webservice_xmlrequests_erstellungxml_transformationen" id="webservice_xmlrequests_erstellungxml_transformationen"></a>2.1.1.3 Transformationen</h4> <h5>Request</h5> <p>Dieses Beispiel (<a href="../../clients/webservice/resources/requests/CreateXMLSignatureRequest.Transforms.xml" target="_blank"><code>CreateXMLSignatureRequest.Transforms.xml</code></a>) 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. </p> <pre><CreateXMLSignatureRequest xmlns="http://reference.e-government.gv.at/namespace/moa/20020822#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"><br> <KeyIdentifier>KG_allgemein</KeyIdentifier><br> <SingleSignatureInfo SecurityLayerConformity="false"></pre> <p>Die Signatur soll mit dem Schlüssel <code>KG_allgemein</code> erstellt werden; jene Elemente, die speziell für eine Security-Layer V1.1 konforme Signatur notwendig sind (vergleiche <a href="#webservice_xmlrequests_erstellungxml_simple" class="term">Einfaches Beispiel</a>), brauchen nicht erstellt zu werden (<code>SecurityLayerConformity="false"</code>).</p> <pre> <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> </pre> <p>Für das erste zu signierende Datenobjekt werden die Referenz-Eingangsdaten mittels <code>DataObject/@Reference</code> referenziert, d. h. MOA SS löst die darin enthaltene URL auf, um zu den Daten zu gelangen. Es handelt sich dabei um einen <a href="../../clients/common/referencedData/Text.b64" target="_blank">base64 kodierten Text</a>.</p> <p>Unterschrieben werden soll nun aber nicht dieser base64 kodierte Text, sondern der entsprechend dekodierte Text. Dies lässt sich elegant durch die Angabe einer <span class="term"><a href="http://www.w3.org/TR/xmldsig-core/#sec-Base-64" target="_blank">Base64 Decoding</a></span><a href="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/#sec-Base-64"> Transformation</a> bewerkstelligen. Dazu wird als erstes Kindelement von <code>CreateTransformsInfo</code> ein <code>dsig:Transforms</code> Element im Request angegeben. Dieses <code>dsig:Transforms</code> Element nimmt ein oderer mehrere <code>dsig:Transform</code> Elemente auf, wobei jedes <code>dsig:Transform</code> 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 <code>dsig:Transform/@Algorithm</code> angegeben. Für die <span class="term">Base64 Decoding</span> Transformation muss der Wert auf <code>http://www.w3.org/2000/09/xmldsig#base64</code> gesetzt werden. Sie ist eine parameterlose Transformation, d. h. <code>dsig:Transform</code> hat keine Kindelemente.</p> <p>Der Mime-Type der zu signierenden Daten wird als <code>text/plain</code> angegeben, da ja tatsächlich nach der durchgeführten Transformation dekodierter Text vorliegt, über den dann der Hashwert berechnet wird. </p> <pre> <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> </pre> <p>Für das zweite zu signierende Datenobjekt werden die Referenz-Eingangsdaten wiederum mittels <code>DataObject/@Reference</code> referenziert, d. h. MOA SS löst die darin enthaltene URL auf, um zu den Daten zu gelangen. Es handelt sich dabei um ein <a href="../../clients/common/referencedData/XMLDocument.xml" target="_blank">XML-Dokument</a>.</p> <p>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<a href="http://www.w3.org/TR/2002/REC-xmldsig-filter2-20021108/" target="_blank" class="term"> XPath Filter 2 Transformation</a> an. Das Attribut <code>dsig:Transform/@Algorithm</code> ist dazu auf den Wert <code>http://www.w3.org/2002/06/xmldsig-filter2</code> zu setzen. Diese Transformation benötigt weiters Transformationsparameter. Diese werden als Kindelement <code>xp2:XPath</code> in <code>dsig:Transform</code> angegeben. Das Attribut <code>Filter</code> selektiert den Filtermodus; für das Bespiel wird den Modus <code>subtract</code> benötigt, da ein Teil weggefiltert werden soll. Der Textinhalt von <code>xp2:XPath</code> ist ein XPath-Ausdruck, der den Wurzelknoten jenes Teilbaums selektiert, der weggefiltert werden soll. Für das Beispiel soll das zweite <code>Paragraph</code> Element des XML-Dokuments weggefiltert werden. Beachten Sie, dass das im XPath-Ausdruck verwendete Namespace-Prefix <code>doc</code> im Kontext des <code>xp2:XPath</code> Elements deklariert sein muss.</p> <p>Als nächstes soll nun das XML-Dokument mit Hilfe eines Stylesheets in ein XHTML-Dokument übergeführt werden. Dazu kann die <a href="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/#sec-XSLT" target="_blank" class="term">XSLT Transformation</a> verwendet werden. Das Attribut <code>dsig:Transform/@Algorithm</code> ist dazu auf den Wert <code>http://www.w3.org/TR/1999/REC-xslt-19991116</code> zu setzen. Auch diese Transformation benötigt Transformationsparameter: Als Kindelement von <code>dsig:Transform</code> wird jener Stylesheet angegeben, mit dem die Stylesheet-Transformation ausgeführt werden soll.</p> <p>Abschließend soll, wie in der Spezifikation der<span class="term"> XSLT-Transformation</span> <a href="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/#sec-XSLT" target="_blank">empfohlen</a>, 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 <code>xml</code> festgelegt werden muss (<code><xsl:output method="xml"></code>), denn nur XML-Output kann anschließend kanonisiert werden. Das Attribut <code>dsig:Transform/@Algorithm</code> ist für die <a href="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/#sec-c14nAlg" target="_blank"><span class="term">Canonical XML Transformation</span></a> auf den Wert http://www.w3.org/TR/2001/REC-xml-c14n-20010315 zu setzen. Die Transformation benötigt keine Transformationsparameter.</p> <p>Das Ergebnis der drei hintereinandergeschalteten Transformationen, welches der Hashwert-Berechnung zufließt, finden Sie <a href="../../clients/webservice/resources/requests/transformResults/CreateXMLSignatureRequest.Transforms.hashinput.ref2.txt" target="_blank">hier</a>. </p> <h5>Response</h5> <p><code><a href="../../clients/webservice/resources/requests/CreateXMLSignatureRequest.Transforms.resp.xml" target="_blank">CreateXMLSignatureRequest.Transforms.resp.xml</a></code> 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.</p> <pre> <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"/> </pre> <p>Die Antwort enthält in <code>SignatureEnvironment</code> das Ergebnis der Signaturerstellung. Nachdem die Signatur in kein bestehendes Dokument eingefügt werden sollte, enhält <code>SignatureEnvironment</code> direkt die erzeugte XML-Signatur (<code>dsig:Signature</code>).</p> <pre> <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> </pre> <p>Die erste <code>dsig:Reference</code> wurde auf Grund des ersten <code>DataObjectInfo</code> im Request erstellt. Man erkennt dass die URL auf die Referenz-Eingangsdaten (Wert des Attributs <code>dsig:Reference/@URI</code>) aus <code>DataObject/@Reference</code> übernommen und eine <span class="term">Base64 Decoding Transformation</span> eingefügt würde. Die im Request spezifizierten Transformationen werden also eins zu eins in die XML-Signatur übernommen.</p> <pre> <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> </pre> <p>Die zweite <code>dsig:Reference</code> wurde auf Grund des zweiten <code>DataObjectInfo</code> im Request erstellt. Man erkennt auch hier gut, dass die URL auf die Referenz-Eingangsdaten (Wert des Attributs <code>dsig:Reference/@URI</code>) aus <code>DataObject/@Reference</code> übernommen und die drei Transformationen wie im Request angegeben eingefügt wurden. </p> <h4><a name="webservice_xmlrequests_erstellungxml_ergaenzungsobjekte"></a>2.1.1.4 Ergänzungsobjekte </h4> <h5>Request</h5> <h5>Response</h5> </body> </html>