<!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 &ouml;sterreichische B&uuml;rgerkarte - Einf&uuml;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&uuml;r das E-Government</div></td> 
    </tr> 
  </table> 
  <hr/> 
  <p class="title"><a href="../index.html">MOA: Serversignatur (SS) und Signaturpr&uuml;fung (SP), V 1.2 </a></p> 
  <p class="subtitle">Anwendung</p> 
  <hr/>
  <h1>Inhalt</h1>
  <ol>
    <li>
      <p><a href="#&#252;bersicht">&Uuml;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&auml;nzungsobjekte</a> </li>
            </ol>
            </li>
            <li>Pr&uuml;fung einer CMS-Signatur</li>
            <li>Pr&uuml;fung einer XML-Signatur
              <ol>
                <li>Einfaches Beispiel</li>
                <li>Erweitertes Beispiel</li>
              </ol>
            </li>
          </ol>
        </li>
        <li>Webservice-Clients
          <ol>
            <li>&Uuml;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 &Uuml;bersicht</h1>
  <p>   Die Module Signaturpr&uuml;fung (SP) und Serversignatur (SS) sind als plattformunabh&auml;ngige Module ausgelegt, die entweder als Webservice &uuml;ber HTTP bzw. HTTPS oder als Klassenbibliothek &uuml;ber ein API angesprochen werden k&ouml;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 &uuml;ber die Webservice-Schnittstelle. Im ersten Unterabschnitt werden typische XML-Requests zur Signaturerstellung mittels SS bzw. zur Signaturpr&uuml;fung mittels SP vorgestellt, wie sie an das Webservice gesendet werden k&ouml;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&uuml;r die Erstellung einer XML-Signatur mittels SS bzw. zur Pr&uuml;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>  &lt;KeyIdentifier&gt;KG_allgemein&lt;/KeyIdentifier&gt; </pre>
  <p><code>KG_allgemein</code> bezeichnet eine Schl&uuml;sselgruppe, aus der SS einen Signaturschl&uuml;ssel selektieren soll und muss einer in der SP/SS-Konfigurationsdatei definierten Schl&uuml;sselgruppe entsprechen. </p>
  <pre>  &lt;SingleSignatureInfo SecurityLayerConformity="false"&gt;</pre>
  <p> F&uuml;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&auml;&szlig; <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&uuml;r die Signatur&uuml;berpr&uuml;fung zu verwendende Zertifikat, Metainformationen zu den signierten Datenobjekten) und ein Manifest, das alle implizite Transformationsparameter enth&auml;lt, zur Signatur hinzugef&uuml;gt. </p>
  <pre>    &lt;DataObjectInfo Structure="enveloping"&gt;
      &lt;DataObject&gt;
        &lt;XMLContent&gt;Diese Daten werden signiert.&lt;XMLContent&gt;
      &lt;/DataObject&gt;</pre>
  <p> </p>
  <p> F&uuml;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 &uuml;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&auml;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&auml;lt Daten in Base64 kodierter Form) oder <code>XMLContent</code> (enth&auml;lt Daten als beliebiges XML-Fragment) oder <code>LocRefContent</code> (enth&auml;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 &uuml;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&auml;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>    &lt;CreateTransformsInfoProfile&gt;<br>      &lt;CreateTransformsInfo&gt;
        &lt;FinalDataMetaInfo&gt;
          &lt;MimeType&gt;text/plain&lt;MimeType&gt;
        &lt;/FinalDataMetaInfo&gt;
      &lt;/CreateTransformsInfo&gt;
    &lt;/CreateTransformsInfoProfile&gt;</pre> 
  Zu jedem Daten-Objekt k&ouml;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&uuml;ckt und gek&uuml;rzt wurde.</p>
  <p>
  <pre>&lt;CreateXMLSignatureResponse
  xmlns=&quot;http://reference.e-government.gv.at/namespace/moa/20020822#&quot; <br>  xmlns:dsig=&quot;http://www.w3.org/2000/09/xmldsig#&quot;&gt;<br>  &lt;SignatureEnvironment&gt;<br>    &lt;dsig:Signature Id=&quot;signature-1-1&quot; xmlns:dsig=&quot;http://www.w3.org/2000/09/xmldsig#&quot;&gt;<br>      &lt;dsig:SignedInfo&gt;
        ...
        &lt;dsig:Reference Id=&quot;reference-1-1&quot; URI=&quot;#xpointer(id(&amp;apos;signed-data-1-1-1&amp;apos;)/node())&quot;&gt;
          ...
        &lt;/dsig:Reference&gt;
        ...
    &lt;/dsig:SignedInfo&gt;
    ...
    &lt;dsig:Object Id=&quot;signed-data-1-1-1&quot;&gt;Diese Daten werden signiert.&lt;/dsig:Object&gt;
    &lt;/dsig:Signature&gt;<br>  &lt;/SignatureEnvironment&gt;<br>&lt;/CreateXMLSignatureResponse&gt;</pre>
  </p>
  <p><code>CreateXMLSignatureResponse</code> enth&auml;lt je erzeugter Signatur ein Element <code>SignatureEnvironment</code> (in diesem Fall genau ein Element). <code>SignatureEnvironment</code> enth&auml;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&auml;ltigen M&ouml;glichkeiten vor, wie MOA SS mitgeteilt werden kann, welche Daten signiert (wenn keine Transformationen angegeben werden) bzw. als Eingangsdaten f&uuml;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>&lt;CreateXMLSignatureRequest 
  xmlns=&quot;http://reference.e-government.gv.at/namespace/moa/20020822#&quot; 
  xmlns:dsig=&quot;http://www.w3.org/2000/09/xmldsig#&quot;&gt;<br>  &lt;KeyIdentifier&gt;KG_allgemein&lt;/KeyIdentifier&gt;<br>  &lt;SingleSignatureInfo SecurityLayerConformity=&quot;false&quot;&gt;</pre>
  <p>Die Signatur soll mit dem Schl&uuml;ssel <code>KG_allgemein</code> erstellt werden; jene Elemente, die speziell f&uuml;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=&quot;false&quot;</code>).</p>
  <pre>    &lt;DataObjectInfo Structure=&quot;enveloping&quot; ChildOfManifest=&quot;true&quot;&gt;
      &lt;DataObject&gt;
        &lt;Base64Content&gt;RGllc2UgRGF0ZW4gd2FyZW4gYmFzZTY0IGtvZGllcnQu&lt;/Base64Content&gt;
      &lt;/DataObject&gt;
      &lt;CreateTransformsInfoProfile&gt;
        &lt;CreateTransformsInfo&gt;
          &lt;FinalDataMetaInfo&gt;
            &lt;MimeType&gt;text/plain&lt;/MimeType&gt;
          &lt;/FinalDataMetaInfo&gt;
        &lt;/CreateTransformsInfo&gt;
      &lt;/CreateTransformsInfoProfile&gt;
    &lt;/DataObjectInfo&gt;</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=&quot;enveloping&quot;</code>). Weiters sollen die Daten nicht &uuml;ber &uuml;ber eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code>, sondern &uuml;ber eine <code>dsig:Reference</code> in einem eigenen <code>dsig:Manifest</code> aufgenommen werden (<code>ChildOfManifest=&quot;true&quot;</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 &uuml;brigen F&auml;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>
    &lt;DataObjectInfo Structure=&quot;enveloping&quot; ChildOfManifest=&quot;false&quot;&gt;
      &lt;DataObject&gt;
        &lt;XMLContent&gt;&lt;doc:XMLDocument xmlns:doc=&quot;urn:document&quot;&gt;
  &lt;doc:Paragraph&gt;Ich bin der erste Absatz in diesem Dokument.&lt;/doc:Paragraph&gt;
  &lt;doc:Paragraph ParaId=&quot;Para2&quot;&gt;Und ich bin der zweite Absatz in diesem Dokument.
Ich habe weiters ein eigenens ID-Attribut bekommen.&lt;/doc:Paragraph&gt;
&lt;/doc:XMLDocument&gt;&lt;/XMLContent&gt;
      &lt;/DataObject&gt;
      &lt;CreateTransformsInfoProfile&gt;
        &lt;CreateTransformsInfo&gt;
          &lt;FinalDataMetaInfo&gt;
            &lt;MimeType&gt;application/xml&lt;/MimeType&gt;
          &lt;/FinalDataMetaInfo&gt;
        &lt;/CreateTransformsInfo&gt;
      &lt;/CreateTransformsInfoProfile&gt;
    &lt;/DataObjectInfo&gt;
</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=&quot;enveloping&quot;</code>). Diesmal sollen die Daten direkt &uuml;ber eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest=&quot;false&quot;</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>
    &lt;DataObjectInfo Structure=&quot;enveloping&quot; ChildOfManifest=&quot;false&quot;&gt;
      &lt;DataObject Reference=&quot;http://localhost:8080/referencedData/Text.txt&quot;/&gt;
      &lt;CreateTransformsInfoProfile&gt;
        &lt;CreateTransformsInfo&gt;
          &lt;FinalDataMetaInfo&gt;
            &lt;MimeType&gt;text/plain&lt;/MimeType&gt;
          &lt;/FinalDataMetaInfo&gt;
        &lt;/CreateTransformsInfo&gt;
      &lt;/CreateTransformsInfoProfile&gt;
    &lt;/DataObjectInfo&gt;
</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=&quot;enveloping&quot;</code>). Wiederum sollen die Daten direkt &uuml;ber eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest=&quot;false&quot;</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&ouml;sen, um zu den zu signierenden Daten zu gelangen. <code>Base64Content</code> oder <code>XMLContent</code> oder <code>LocRefContent</code> d&uuml;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>
    &lt;DataObjectInfo Structure=&quot;enveloping&quot; ChildOfManifest=&quot;false&quot;&gt;
      &lt;DataObject&gt;
        &lt;LocRefContent&gt;http://localhost:8080/referencedData/Text.txt&lt;/LocRefContent&gt;
      &lt;/DataObject&gt;
      &lt;CreateTransformsInfoProfile&gt;
        &lt;CreateTransformsInfo&gt;
          &lt;FinalDataMetaInfo&gt;
            &lt;MimeType&gt;text/plain&lt;/MimeType&gt;
          &lt;/FinalDataMetaInfo&gt;
        &lt;/CreateTransformsInfo&gt;
      &lt;/CreateTransformsInfoProfile&gt;
    &lt;/DataObjectInfo&gt;
</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=&quot;enveloping&quot;</code>). Wiederum sollen die Daten direkt &uuml;ber eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest=&quot;false&quot;</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&uuml;r <span class="term">Location Reference</span>). <code>DataObject/@Reference</code> darf in diesem Fall nicht verwendet werden. Diese Methode ist semantisch v&ouml;llig ident mit dem vorhergehenden Fall. </p>
<p>Der Mime-Type der zu signierenden Daten wird als <code>text/plain</code> angegeben.</p>
<pre>
    &lt;DataObjectInfo Structure=&quot;detached&quot; ChildOfManifest=&quot;true&quot;&gt;
      &lt;DataObject Reference=&quot;http://localhost:8080/referencedData/Text.b64&quot;&gt;
        &lt;Base64Content&gt;RGllc2UgRGF0ZW4gd2FyZW4gYmFzZTY0IGtvZGllcnQu&lt;/Base64Content&gt;
      &lt;/DataObject&gt;
      &lt;CreateTransformsInfoProfile&gt;
        &lt;CreateTransformsInfo&gt;
          &lt;FinalDataMetaInfo&gt;
            &lt;MimeType&gt;text/plain&lt;/MimeType&gt;
          &lt;/FinalDataMetaInfo&gt;
        &lt;/CreateTransformsInfo&gt;
      &lt;/CreateTransformsInfoProfile&gt;
    &lt;/DataObjectInfo&gt;
</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=&quot;detached&quot;</code>). Die Daten sollen indirekt &uuml;ber eine <code>dsig:Reference</code> eines <code>dsig:Manifest</code>s aufgenommen werden  (<code>ChildOfManifest=&quot;true&quot;</code>). </p>
<p>Die URI in <code>DataObject/@Reference</code> enth&auml;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&ouml;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>
    &lt;DataObjectInfo Structure="detached" ChildOfManifest="false"&gt;
      &lt;DataObject Reference="NichtAufloesbareReferenz1"&gt;
        &lt;XMLContent&gt;&lt;doc:XMLDocument xmlns:doc="urn:document"&gt;
  &lt;doc:Paragraph&gt;Ich bin der erste Absatz in diesem Dokument.&lt;/doc:Paragraph&gt;
  &lt;doc:Paragraph ParaId="Para2"&gt;Und ich bin der zweite Absatz in diesem Dokument. 
Ich habe weiters ein eigenens ID-Attribut bekommen.&lt;/doc:Paragraph&gt;
&lt;/doc:XMLDocument&gt;&lt;/XMLContent&gt;
      &lt;/DataObject&gt;
      &lt;CreateTransformsInfoProfile&gt;
        &lt;CreateTransformsInfo&gt;
          &lt;FinalDataMetaInfo&gt;
            &lt;MimeType&gt;application/xml&lt;/MimeType&gt;
          &lt;/FinalDataMetaInfo&gt;
        &lt;/CreateTransformsInfo&gt;
      &lt;/CreateTransformsInfoProfile&gt;
    &lt;/DataObjectInfo&gt;
</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=&quot;detached&quot;</code>). Diesmal sollen die Daten direkt &uuml;ber eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest=&quot;false&quot;</code>).
</p>
<p>Die URI in <code>DataObject/@Reference</code> enth&auml;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&ouml;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&ouml;st werden kann (<code>NichtAufloesbareReferenz1</code>). </p>
<p>Der Mime-Type der zu signierenden Daten wird als <code>application/xml</code> angegeben.</p>
<pre>
    &lt;DataObjectInfo Structure=&quot;detached&quot; ChildOfManifest=&quot;false&quot;&gt;
      &lt;DataObject Reference=&quot;http://localhost:8080/referencedData/Text.txt&quot;&gt;
      &lt;/DataObject&gt;
      &lt;CreateTransformsInfoProfile&gt;
        &lt;CreateTransformsInfo&gt;
          &lt;FinalDataMetaInfo&gt;
            &lt;MimeType&gt;text/plain&lt;/MimeType&gt;
          &lt;/FinalDataMetaInfo&gt;
        &lt;/CreateTransformsInfo&gt;
      &lt;/CreateTransformsInfoProfile&gt;
    &lt;/DataObjectInfo&gt;
</pre>
<p>Wiederum sollen die Daten in der <span class="term">Detached</span> Form in die Signatur aufgenommen werden (<code>Structure=&quot;detached&quot;</code>). Wie zuvor sollen die Daten direkt &uuml;ber eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest=&quot;false&quot;</code>). </p>
<p>Die URI in <code>DataObject/@Reference</code> enth&auml;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&ouml;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>
    &lt;DataObjectInfo Structure=&quot;detached&quot; ChildOfManifest=&quot;false&quot;&gt;
      &lt;DataObject Reference=&quot;NichtAufloesbareReferenz2&quot;&gt;
        &lt;LocRefContent&gt;http://localhost:8080/referencedData/Text.txt&lt;/LocRefContent&gt;
      &lt;/DataObject&gt;
      &lt;CreateTransformsInfoProfile&gt;
        &lt;CreateTransformsInfo&gt;
          &lt;FinalDataMetaInfo&gt;
            &lt;MimeType&gt;text/plain&lt;/MimeType&gt;
          &lt;/FinalDataMetaInfo&gt;
        &lt;/CreateTransformsInfo&gt;
      &lt;/CreateTransformsInfoProfile&gt;
    &lt;/DataObjectInfo&gt;
</pre>
<p>Wiederum sollen die Daten in der <span class="term">Detached</span> Form in die Signatur aufgenommen werden (<code>Structure=&quot;detached&quot;</code>). Wie zuvor sollen die Daten direkt &uuml;ber eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest=&quot;false&quot;</code>).</p>
<p>Die URI in <code>DataObject/@Reference</code> enth&auml;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&ouml;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&ouml;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&uuml;ssen, als sp&auml;ter dann bei der Signaturpr&uuml;fung.</p>
<p>Der Mime-Type der zu signierenden Daten wird als <code>text/plain</code> angegeben.</p>
<pre>
    &lt;DataObjectInfo Structure=&quot;detached&quot; ChildOfManifest=&quot;false&quot;&gt;
      &lt;DataObject Reference=&quot;&quot;/&gt;
      &lt;CreateTransformsInfoProfile&gt;
        &lt;CreateTransformsInfo&gt;
          &lt;dsig:Transforms&gt;
            &lt;dsig:Transform Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#enveloped-signature&quot;/&gt;
          &lt;/dsig:Transforms&gt;
          &lt;FinalDataMetaInfo&gt;
            &lt;MimeType&gt;application/xml&lt;/MimeType&gt;
          &lt;/FinalDataMetaInfo&gt;
        &lt;/CreateTransformsInfo&gt;
      &lt;/CreateTransformsInfoProfile&gt;
    &lt;/DataObjectInfo&gt;
</pre>
<p>Im letzten Fall schlie&szlig;lich sollen wiederum Daten in der <span class="term">Detached</span> Form in die Signatur aufgenommen werden (<code>Structure=&quot;detached&quot;</code>). Wie zuvor sollen die Daten direkt &uuml;ber eine <code>dsig:Reference</code> in <code>dsig:SignedInfo</code> aufgenommen werden (<code>ChildOfManifest=&quot;false&quot;</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>&quot;&quot;</code>) enth&auml;lt. Nachdem dadurch zwangsl&auml;ufig auch die Signatur in den zu signierenden Daten enthalten w&auml;re, wird die Signatur durch die Angabe einer Enveloped Signature Transform aus den zu signierenden Daten herausgenommen, bevor dar&uuml;ber der Hashwert berechnet wird (dsig:Transform).</p>
<p>Offen bleibt die Frage, wie MOA SS nun wei&szlig;, in welches (XML-)Dokument es die die Signatur integrieren soll. Siehe dazu die Erl&auml;uterungen zum n&auml;chsten Ausschnitts des Requests. </p>
<p>Der Mime-Type der zu signierenden Daten wird als <code>application/xml</code> angegeben.</p>
<pre>
    &lt;CreateSignatureInfo&gt;
      &lt;CreateSignatureEnvironment&gt;
        &lt;LocRefContent&gt;http://localhost:8080/referencedData/XMLDocument.xml&lt;/LocRefContent&gt;
      &lt;/CreateSignatureEnvironment&gt;
      &lt;CreateSignatureEnvironmentProfile&gt;
        &lt;CreateSignatureLocation Index=&quot;4&quot; xmlns:doc=&quot;urn:document&quot;&gt;/doc:XMLDocument&lt;/CreateSignatureLocation&gt;
      &lt;/CreateSignatureEnvironmentProfile&gt;
    &lt;/CreateSignatureInfo&gt;
</pre>
<p>Das Element <code>CreateSignatureInfo</code> ist grunds&auml;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&auml;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&ouml;sen, um das XML-Dokument zu erhalten. Alternativ k&ouml;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&auml;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&auml;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&uuml;gt werden. Der Inhalt von <code>CreateSignatureLocation</code> (<code>/doc:XMLDocument</code>) selektiert das zuk&uuml;nftige <span class="term">Parent</span>-Element der Signatur, also <code>doc:XMLDocument</code>. Das Attribut <code>Index</code> enth&auml;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&auml;hlen begonnen wird, und zweitens auch die Text-Knoten, die lediglich Whitespace enthalten, f&uuml;r diesen Offset z&auml;hlen (um diese Textknoten erkennen zu k&ouml;nnen, m&uuml;ssen Sie das XML-Dokument in einem Text-Editor &ouml;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&auml;lt dieses Element auch die entsprechende Namespace-Deklaration (<code>xmlns:doc=&quot;urn:document&quot;</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&uuml;ckt und gek&uuml;rzt wurde.</p>
<pre>
&lt;CreateXMLSignatureResponse 
  xmlns=&quot;http://reference.e-government.gv.at/namespace/moa/20020822#&quot; 
  xmlns:dsig=&quot;http://www.w3.org/2000/09/xmldsig#&quot;&gt;
  &lt;SignatureEnvironment&gt;
    &lt;doc:XMLDocument xmlns:doc=&quot;urn:document&quot;&gt;
      &lt;doc:Paragraph&gt;Ich bin der erste Absatz in diesem Dokument.&lt;/doc:Paragraph&gt;
      &lt;doc:Paragraph ParaId=&quot;Para2&quot;&gt;Und ich bin der zweite Absatz in diesem Dokument.
Ich habe weiters ein eigenens ID-Attribut bekommen.&lt;/doc:Paragraph&gt;&lt;dsig:Signature Id=&quot;signature-1-1&quot; 
        xmlns:dsig=&quot;http://www.w3.org/2000/09/xmldsig#&quot;&gt;
        &lt;dsig:SignedInfo&gt;
          &lt;dsig:CanonicalizationMethod Algorithm=&quot;http://www.w3.org/TR/2001/REC-xml-c14n-20010315&quot;/&gt;
          &lt;dsig:SignatureMethod Algorithm=&quot;http://www.buergerkarte.at/namespaces/ecdsa/200206030#ecdsa-sha1&quot;/&gt;
</pre>
<p>Die Antwort enth&auml;lt in <code>SignatureEnvironment</code> das Ergebnis der Signaturerstellung. Nachdem die Signatur in ein bestehendes XML-Dokument integriert werden sollte, enth&auml;lt <code>SignatureEnvironment</code> das Dokument-Element dieses XML-Dokuments (<code>doc:XMLDocument</code>). Man erkennt auch gut, dass die XML-Signatur als f&uuml;nfter Kindknoten (Offset <code>4</code>) von <code>doc:XMLDocument</code> eingef&uuml;gt wurde.</p>
<pre>
          &lt;dsig:Reference Id=&quot;reference-1-2&quot; URI=&quot;#xpointer(id(&apos;signed-data-1-2-1&apos;)/node())&quot;&gt;
            &lt;dsig:DigestMethod Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#sha1&quot;/&gt;
            &lt;dsig:DigestValue&gt;A8ml6/aZKCmj1hONwvLItIwGHoc=&lt;/dsig:DigestValue&gt;
          &lt;/dsig:Reference&gt;
</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&auml;lt (der XPointer verweist auf s&auml;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>
          &lt;dsig:Reference Id=&quot;reference-1-3&quot; URI=&quot;#xpointer(id(&apos;signed-data-1-3-1&apos;)/node())&quot;&gt;
            &lt;dsig:Transforms&gt;
              &lt;dsig:Transform Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#base64&quot;/&gt;
            &lt;/dsig:Transforms&gt;
            &lt;dsig:DigestMethod Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#sha1&quot;/&gt;
            &lt;dsig:DigestValue&gt;0P878Dsmtxv5goj+6KgNmj6S/EE=&lt;/dsig:DigestValue&gt;
          &lt;/dsig:Reference&gt;
</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&ouml;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>
          &lt;dsig:Reference Id=&quot;reference-1-4&quot; URI=&quot;#xpointer(id(&apos;signed-data-1-4-1&apos;)/node())&quot;&gt;
            &lt;dsig:Transforms&gt;
              &lt;dsig:Transform Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#base64&quot;/&gt;
            &lt;/dsig:Transforms&gt;
            &lt;dsig:DigestMethod Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#sha1&quot;/&gt;
            &lt;dsig:DigestValue&gt;0P878Dsmtxv5goj+6KgNmj6S/EE=&lt;/dsig:DigestValue&gt;
          &lt;/dsig:Reference&gt;
</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&uuml;hrt, ist die erstellte<code> dsig:Reference</code> semantisch genau gleich wie die vorhergehende. </p>
<pre>
          &lt;dsig:Reference Id=&quot;reference-1-6&quot; URI=&quot;NichtAufloesbareReferenz1&quot;&gt;
            &lt;dsig:DigestMethod Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#sha1&quot;/&gt;
            &lt;dsig:DigestValue&gt;2b83+NbXDFijHzz+sH0T7fM36sA=&lt;/dsig:DigestValue&gt;
          &lt;/dsig:Reference&gt;
</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> &uuml;bernommen. </p>
<pre>
          &lt;dsig:Reference Id=&quot;reference-1-7&quot; URI=&quot;http://localhost:8080/referencedData/Text.txt&quot;&gt;
            &lt;dsig:DigestMethod Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#sha1&quot;/&gt;
            &lt;dsig:DigestValue&gt;0P878Dsmtxv5goj+6KgNmj6S/EE=&lt;/dsig:DigestValue&gt;
          &lt;/dsig:Reference&gt;
</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&ouml;st. Gleicherma&szlig;en wurde die URL in <code>dsig:Reference/@URI</code> &uuml;bernommen. </p>
<pre>
          &lt;dsig:Reference Id=&quot;reference-1-8&quot; URI=&quot;NichtAufloesbareReferenz2&quot;&gt;
            &lt;dsig:DigestMethod Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#sha1&quot;/&gt;
            &lt;dsig:DigestValue&gt;0P878Dsmtxv5goj+6KgNmj6S/EE=&lt;/dsig:DigestValue&gt;
          &lt;/dsig:Reference&gt;
</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&ouml;st. In <code>dsig:Reference/@URI</code> wurde der Wert aus <code>DataObjectInfo/@Reference</code> &uuml;bernommen.</p>
<pre>
          &lt;dsig:Reference Id=&quot;reference-1-9&quot; URI=&quot;&quot;&gt;
            &lt;dsig:Transforms&gt;
              &lt;dsig:Transform Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#enveloped-signature&quot;/&gt;
            &lt;/dsig:Transforms&gt;
            &lt;dsig:DigestMethod Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#sha1&quot;/&gt;
            &lt;dsig:DigestValue&gt;2b83+NbXDFijHzz+sH0T7fM36sA=&lt;/dsig:DigestValue&gt;
          &lt;/dsig:Reference&gt;
</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&auml;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>
          &lt;dsig:Reference Type=&quot;http://www.w3.org/2000/09/xmldsig#Manifest&quot; URI=&quot;#dsig-manifest-1-1&quot;&gt;
            &lt;dsig:DigestMethod Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#sha1&quot;/&gt;
            &lt;dsig:DigestValue&gt;mNsxUkFoF46XZVBivBo4aasFCTQ=&lt;/dsig:DigestValue&gt;
          &lt;/dsig:Reference&gt;
</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>
        &lt;/dsig:SignedInfo&gt;
        &lt;dsig:SignatureValue&gt;...&lt;/dsig:SignatureValue&gt;
        &lt;dsig:KeyInfo&gt;...&lt;/dsig:KeyInfo&gt;
        &lt;dsig:Object Id=&quot;signed-data-1-2-1&quot;&gt;
          &lt;doc:XMLDocument xmlns:doc=&quot;urn:document&quot;&gt;
            &lt;doc:Paragraph&gt;Ich bin der erste Absatz in diesem Dokument.&lt;/doc:Paragraph&gt;
            &lt;doc:Paragraph ParaId=&quot;Para2&quot;&gt;Und ich bin der zweite Absatz in diesem Dokument.
Ich habe weiters ein eigenens ID-Attribut bekommen.&lt;/doc:Paragraph&gt;
          &lt;/doc:XMLDocument&gt;
        &lt;/dsig:Object&gt;
        &lt;dsig:Object Id=&quot;signed-data-1-3-1&quot;&gt;RGllc2UgRGF0ZW4gc2luZCByZWluZXIgVGV4dC4=&lt;/dsig:Object&gt;
        &lt;dsig:Object Id=&quot;signed-data-1-4-1&quot;&gt;RGllc2UgRGF0ZW4gc2luZCByZWluZXIgVGV4dC4=&lt;/dsig:Object&gt;
        &lt;dsig:Object Id=&quot;signed-data-1-1-1&quot;&gt;RGllc2UgRGF0ZW4gd2FyZW4gYmFzZTY0IGtvZGllcnQu&lt;/dsig:Object&gt;
</pre>
<p><code>SignatureValue</code> und <code>KeyInfo</code> werden an dieser Stelle nicht n&auml;her betrachtet.</p>
<p>Das erste <code>dsig:Object</code> enth&auml;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&szlig;lich jene aus dem ersten <code>DataObjectInfo</code>.</p>
<pre>
        &lt;dsig:Object&gt;
          &lt;dsig:Manifest Id=&quot;dsig-manifest-1-1&quot;&gt;
            &lt;dsig:Reference Id=&quot;reference-1-1&quot; URI=&quot;#xpointer(id(&apos;signed-data-1-1-1&apos;)/node())&quot;&gt;
              &lt;dsig:Transforms&gt;
                &lt;dsig:Transform Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#base64&quot;/&gt;
              &lt;/dsig:Transforms&gt;
              &lt;dsig:DigestMethod Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#sha1&quot;/&gt;
              &lt;dsig:DigestValue&gt;a53jOsL7KbyltpByAK87FoMZphI=&lt;/dsig:DigestValue&gt;
            &lt;/dsig:Reference&gt;
            &lt;dsig:Reference Id=&quot;reference-1-5&quot; URI=&quot;http://localhost:8080/referencedData/Text.b64&quot;&gt;
              &lt;dsig:DigestMethod Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#sha1&quot;/&gt;
              &lt;dsig:DigestValue&gt;a53jOsL7KbyltpByAK87FoMZphI=&lt;/dsig:DigestValue&gt;
            &lt;/dsig:Reference&gt;
          &lt;/dsig:Manifest&gt;
        &lt;/dsig:Object&gt;
</pre>
<p>Das f&uuml;nfte <code>dsig:Object</code> enth&auml;lt das <code>dsig:Manifest</code>, das von MOA SS auf Grund des ersten bzw. f&uuml;nften <code>DataObjectInfo</code> des Requests erstellt wurde. Darin enthalten sind die zum ersten und f&uuml;nten <code>DataObjectInfo</code> korrespondierenden <code>dsig:Reference</code> Elemente. Die Daten f&uuml;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&uuml;r die zweite <code>dsig:Reference</code> aus dem <code>Base64Content</code> Element des f&uuml;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&uuml;nften <code>DataObjectInfo</code> &uuml;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&ouml;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&szlig;t dann in die Hashwert-Berechnung ein. </p>
<pre>&lt;CreateXMLSignatureRequest 
  xmlns=&quot;http://reference.e-government.gv.at/namespace/moa/20020822#&quot; 
  xmlns:dsig=&quot;http://www.w3.org/2000/09/xmldsig#&quot;&gt;<br>  &lt;KeyIdentifier&gt;KG_allgemein&lt;/KeyIdentifier&gt;<br>  &lt;SingleSignatureInfo SecurityLayerConformity=&quot;false&quot;&gt;</pre>
<p>Die Signatur soll mit dem Schl&uuml;ssel <code>KG_allgemein</code> erstellt werden; jene Elemente, die speziell f&uuml;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=&quot;false&quot;</code>).</p>
<pre>
    &lt;DataObjectInfo Structure=&quot;detached&quot;&gt;
      &lt;DataObject Reference=&quot;http://localhost:8080/referencedData/Text.b64&quot;/&gt;
      &lt;CreateTransformsInfoProfile&gt;
        &lt;CreateTransformsInfo&gt;
          &lt;dsig:Transforms&gt;
            &lt;dsig:Transform Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#base64&quot;/&gt;
          &lt;/dsig:Transforms&gt;
          &lt;FinalDataMetaInfo&gt;
            &lt;MimeType&gt;text/plain&lt;/MimeType&gt;
          &lt;/FinalDataMetaInfo&gt;
        &lt;/CreateTransformsInfo&gt;
      &lt;/CreateTransformsInfoProfile&gt;
    &lt;/DataObjectInfo&gt;
</pre> 
<p>F&uuml;r das erste zu signierende Datenobjekt werden die Referenz-Eingangsdaten  mittels <code>DataObject/@Reference</code> referenziert, d. h. MOA SS l&ouml;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&auml;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&uuml;r eine Transformation steht. In unserem Fall wird nur eine einzige Transformation ben&ouml;tigt; die Angabe, um welche Transformation es sich handelt, wird durch das Attribut <code>dsig:Transform/@Algorithm</code> angegeben. F&uuml;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&auml;chlich nach der durchgef&uuml;hrten Transformation dekodierter Text vorliegt, &uuml;ber den dann der Hashwert berechnet wird. </p>
<pre>
    &lt;DataObjectInfo Structure=&quot;detached&quot;&gt;
      &lt;DataObject Reference=&quot;http://localhost:8080/referencedData/XMLDocument.xml&quot;/&gt;
      &lt;CreateTransformsInfoProfile&gt;
        &lt;CreateTransformsInfo&gt;
          &lt;dsig:Transforms&gt;
            &lt;dsig:Transform Algorithm=&quot;http://www.w3.org/2002/06/xmldsig-filter2&quot;&gt;
              &lt;xp2:XPath 
                xmlns:xp2=&quot;http://www.w3.org/2002/06/xmldsig-filter2&quot; 
                xmlns:doc=&quot;urn:document&quot; 
                Filter=&quot;subtract&quot;&gt;/doc:XMLDocument/doc:Paragraph[2]&lt;/xp2:XPath&gt;
            &lt;/dsig:Transform&gt;
            &lt;dsig:Transform Algorithm=&quot;http://www.w3.org/TR/1999/REC-xslt-19991116&quot;&gt;
              &lt;xsl:stylesheet version=&quot;1.0&quot; 
                xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot; xmlns:doc=&quot;urn:document&quot;&gt;
  &lt;xsl:output encoding=&quot;UTF-8&quot; method=&quot;xml&quot; indent=&quot;yes&quot;/&gt;
  &lt;xsl:template match=&quot;/doc:XMLDocument&quot;&gt;
    &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
      &lt;head&gt;
        &lt;title&gt;HTML-Dokument&lt;/title&gt;
      &lt;/head&gt;
      &lt;body&gt;
        &lt;xsl:for-each select=&quot;doc:Paragraph&quot;&gt;
          &lt;p&gt;
            &lt;xsl:value-of select=&quot;child::text()&quot;/&gt;
          &lt;/p&gt;
        &lt;/xsl:for-each&gt;
      &lt;/body&gt;
    &lt;/html&gt;
  &lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;&lt;/dsig:Transform&gt;
            &lt;dsig:Transform Algorithm=&quot;http://www.w3.org/TR/2001/REC-xml-c14n-20010315&quot;/&gt;
          &lt;/dsig:Transforms&gt;
          &lt;FinalDataMetaInfo&gt;
            &lt;MimeType&gt;application/xhtml+xml&lt;/MimeType&gt;
          &lt;/FinalDataMetaInfo&gt;
        &lt;/CreateTransformsInfo&gt;
      &lt;/CreateTransformsInfoProfile&gt;
    &lt;/DataObjectInfo&gt;
</pre>
<p>F&uuml;r das zweite zu signierende Datenobjekt werden die Referenz-Eingangsdaten wiederum mittels <code>DataObject/@Reference</code> referenziert, d. h. MOA SS l&ouml;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&auml;chst soll von diesem XML-Dokument jedoch ein Teil weggeschnitten werden, da er nicht mitsigniert werden soll. F&uuml;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&ouml;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&uuml;r das Bespiel  wird den Modus <code>subtract</code> ben&ouml;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&uuml;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&auml;chstes soll nun das XML-Dokument mit Hilfe eines Stylesheets in ein XHTML-Dokument &uuml;bergef&uuml;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&ouml;tigt Transformationsparameter: Als Kindelement von <code>dsig:Transform</code> wird jener Stylesheet angegeben, mit dem die Stylesheet-Transformation ausgef&uuml;hrt werden soll.</p>
<p>Abschlie&szlig;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&ouml;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>&lt;xsl:output method=&quot;xml&quot;&gt;</code>), denn nur XML-Output kann anschlie&szlig;end kanonisiert werden. Das Attribut <code>dsig:Transform/@Algorithm</code> ist f&uuml;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&ouml;tigt keine Transformationsparameter.</p>
<p>Das Ergebnis der drei hintereinandergeschalteten Transformationen, welches der Hashwert-Berechnung zuflie&szlig;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&uuml;ckt und gek&uuml;rzt wurde.</p>
<pre>
&lt;CreateXMLSignatureResponse 
  xmlns=&quot;http://reference.e-government.gv.at/namespace/moa/20020822#&quot; 
  xmlns:dsig=&quot;http://www.w3.org/2000/09/xmldsig#&quot;&gt;
  &lt;SignatureEnvironment&gt;
    &lt;dsig:Signature Id=&quot;signature-1-1&quot; xmlns:dsig=&quot;http://www.w3.org/2000/09/xmldsig#&quot;&gt;
      &lt;dsig:SignedInfo&gt;
        &lt;dsig:CanonicalizationMethod Algorithm=&quot;http://www.w3.org/TR/2001/REC-xml-c14n-20010315&quot;/&gt;
        &lt;dsig:SignatureMethod Algorithm=&quot;http://www.buergerkarte.at/namespaces/ecdsa/200206030#ecdsa-sha1&quot;/&gt;
</pre>
<p>Die Antwort enth&auml;lt in <code>SignatureEnvironment</code> das Ergebnis der Signaturerstellung. Nachdem die Signatur in kein bestehendes Dokument eingef&uuml;gt werden sollte, enh&auml;lt <code>SignatureEnvironment</code> direkt die erzeugte XML-Signatur (<code>dsig:Signature</code>).</p>
<pre>
        &lt;dsig:Reference Id=&quot;reference-1-1&quot; URI=&quot;http://localhost:8080/referencedData/Text.b64&quot;&gt;
          &lt;dsig:Transforms&gt;
            &lt;dsig:Transform Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#base64&quot;/&gt;
          &lt;/dsig:Transforms&gt;
          &lt;dsig:DigestMethod Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#sha1&quot;/&gt;
          &lt;dsig:DigestValue&gt;a53jOsL7KbyltpByAK87FoMZphI=&lt;/dsig:DigestValue&gt;
        &lt;/dsig:Reference&gt;
</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> &uuml;bernommen und eine <span class="term">Base64 Decoding Transformation</span> eingef&uuml;gt w&uuml;rde. Die im Request spezifizierten Transformationen werden also eins zu eins in die XML-Signatur &uuml;bernommen.</p>
<pre>
        &lt;dsig:Reference Id=&quot;reference-1-2&quot; URI=&quot;http://localhost:8080/referencedData/XMLDocument.xml&quot;&gt;
          &lt;dsig:Transforms&gt;
            &lt;dsig:Transform Algorithm=&quot;http://www.w3.org/2002/06/xmldsig-filter2&quot;&gt;
              &lt;xp2:XPath Filter=&quot;subtract&quot; xmlns:doc=&quot;urn:document&quot; 
                xmlns:dsig=&quot;http://www.w3.org/2000/09/xmldsig#&quot; 
                xmlns:xf2=&quot;http://www.w3.org/2002/06/xmldsig-filter2&quot; 
                xmlns:xp2=&quot;http://www.w3.org/2002/06/xmldsig-filter2&quot;&gt;/doc:XMLDocument/doc:Paragraph[2]&lt;/xp2:XPath&gt;
            &lt;/dsig:Transform&gt;
            &lt;dsig:Transform Algorithm=&quot;http://www.w3.org/TR/1999/REC-xslt-19991116&quot;&gt;
              &lt;xsl:stylesheet version=&quot;1.0&quot; 
                xmlns:doc=&quot;urn:document&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
                &lt;xsl:output encoding=&quot;UTF-8&quot; indent=&quot;yes&quot; method=&quot;xml&quot;/&gt;
                &lt;xsl:template match=&quot;/doc:XMLDocument&quot;&gt;...&lt;/xsl:template&gt;
              &lt;/xsl:stylesheet&gt;
            &lt;/dsig:Transform&gt;
            &lt;dsig:Transform Algorithm=&quot;http://www.w3.org/TR/2001/REC-xml-c14n-20010315&quot;/&gt;
          &lt;/dsig:Transforms&gt;
          &lt;dsig:DigestMethod Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#sha1&quot;/&gt;
          &lt;dsig:DigestValue&gt;fIPwneCpjVqTXwHMN9DFfx6tJIU=&lt;/dsig:DigestValue&gt;
        &lt;/dsig:Reference&gt;
</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> &uuml;bernommen und die drei Transformationen wie im Request angegeben eingef&uuml;gt wurden. </p>
<h4><a name="webservice_xmlrequests_erstellungxml_ergaenzungsobjekte"></a>2.1.1.4 Erg&auml;nzungsobjekte </h4>
<h5>Request</h5>
<h5>Response</h5>
</body>
</html>