XPath-Ausdrücke für WS-Security erstellen

WS-Security-Konfigurationen in JAX-RPC und JAX-WS verwenden XML-basierte SOAP-Nachrichten, um Informationen zwischen den Anwendungen auszutauschen. Sie können einen XPath-Ausdruck verwenden, um bestimmte Elemente in einer SOAP-Nachricht zum Signieren oder Verschlüsseln auszuwählen.

Vorbereitende Schritte

Wenn Sie Elemente in einer SOAP-Nachricht (Simple Object Access Protocol) signieren oder verschlüsseln möchten, können Sie die bestimmten Elemente in der Nachricht mit XPath-Ausdrücken auswählen. SOAP-1.1- und SOAP-1.2-Nachrichten habe ein unterschiedliches Format und erfordern daher separate XPath-Ausdrücke zur Auswahl der Elemente in den verschiedenen Versionen der Nachricht. Die JAX-WS-Laufzeitumgebung unterstützt sowohl SOAP 1.1 als auch SOAP 1.2., daher müssen Sie in die WS-Security-Richtlinien für jedes auszuwählende Element zwei XPath-Ausdrücke aufnehmen: einen für SOAP 1.1 und einen für SOAP 1.2. Die JAX-RPC-Laufzeitumgebung unterstützt nur SOAP 1.1, daher müssen Sie nur die Version SOAP 1.1 des XPath-Ausdrucks in die WS-Security-Richtlinien aufnehmen.

Die Unterschiede im Format von SOAP-1.1- und SOAP-1.2-Nachrichten sind im folgenden Szenario zur Auswahl des Elements Timestamp in den SOAP-Nachrichten einer WS-Security-Konfiguration in JAX-WS hervorgehoben.

Das folgende Beispiel zeigt eine SOAP-1.1-Nachricht mit einem Timestamp-Element.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsu:Timestamp wsu:Id="Timestamp-16" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsu:Created>2012-01-11T12:55:41.781Z</wsu:Created>
        <wsu:Expires>2012-01-11T15:42:21.781Z</wsu:Expires>
      </wsu:Timestamp>
    </wsse:Security>
  </soapenv:Header>
</soapenv:Envelope>

Das folgende Beispiel zeigt eine SOAP-1.2-Nachricht mit einem Timestamp-Element.

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
  <soapenv:Header>
    <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
      <wsu:Timestamp u:Id="uuid-169b0950-217e-48af-9057-ea832e0c7e19-14" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <wsu:Created>2009-09-08T14:08:36.224Z</wsu:Created>
        <wsu:Expires>2009-09-08T14:13:36.224Z</wsu:Expires>
      </wsu:Timestamp>
    </wsse:Security>
  </soapenv:Header>
</soapenv:Envelope>

Die XPath-Ausdrücke, die SOAP-Nachrichtenelemente auswählen, befinden sich in den WS-Security-Standardrichtlinien, die Konfigurationsinformationen für die digitale XML-Signatur enthalten. In einer JAX-WS-WS-Security-Konfiguration erscheinen die XPath-Ausdrücke paarweise, wobei jeweils ein XPath-Ausdruck für jede unterstützte SOAP-Version enthalten ist.

Im folgenden Beispiel sind die XPath-Ausdrücke dargestellt, mit denen das Element Timestamp (Zeitmarke) in den SOAP-1.1- und SOAP-1.2-Nachrichten in den vorherigen Beispielen ausgewählt wird. Der erste XPath-Ausdruck wählt Timestamp in der SOAP-1.1-Nachricht aus, und der zweite XPath-Ausdruck wählt Timestamp in der SOAP-1.2-Nachricht aus.

/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Envelope']
/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Header']
/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='Security']
/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' and local-name()='Timestamp']

/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' and local-name()='Envelope']
/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' and local-name()='Header']
/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='Security']
/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' and local-name()='Timestamp']

Die ersten beiden Zeilen der XPath-Ausdrücke sind für jede Version verschieden, die letzten beiden Zeilen der XPath-Ausdrücke sind gleich. Der Unterschied zwischen den beiden XPath-Ausdrücken ist der Namespace in den Elementen Envelope und Header. Die Namespaces in den XPath-Ausdrücken entsprechen den Namespaces in den SOAP-1.1- und SOAP-1.2-Nachrichten.

Informationen zu diesem Vorgang

Diese Aufgabe beschreibt, wie XPath-Ausdrücke erstellt werden, die zum Signieren oder Verschlüsseln eines Elements in WS-Security verwendet werden. JAX-WS-Sicherheitskonfigurationen erfordern separate XPath-Ausdrücke für SOAP 1.1 und SOAP 1.2, während in JAX-RPC-Sicherheitskonfigurationen nur XPath-Ausdrücke für SOAP 1.1 erforderlich sind.

Wenn Sie ein SOAP-Nachrichtenelement auswählen möchten, das in WS-Security häufig verwendet wird, sehen Sie sich Option 1 zum Erstellen von XPath-Ausdrücken mit vvordefinierten Codesegmenten an. Andernfalls fahren Sie mit Option 2 fort, um zu erfahren, wie angepasste XPath-Ausdrücke für andere Elemente erstellt werden.

Fehler vermeiden Fehler vermeiden: Die Beispiele für XPath-Ausdrücke in dieser Aufgabe sind aus Gründen der Formatierung und Übersichtlichkeit in mehreren Zeilen dargestellt. Wenn Sie Ihre fertig gestellten XPath-Ausdrücke in WS-Security aufnehmen, müssen Sie den vollständigen XPath-Ausdruck in einer einzelnen Zeile eingeben.gotcha

Vorgehensweise

  1. Häufig verwendeten XPath-Ausdruck mit vordefinierten Codesegmenten erstellen.
    1. Erstellen Sie den Teil des XPath-Ausdrucks, der auf den SOAP-Sicherheitsheader (Security) verweist.
      • SOAP 1.1:
        /*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Envelope']
        /*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Header']
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='Security']
      • SOAP 1.2:
        /*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' and local-name()='Envelope']
        /*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' and local-name()='Header']
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='Security']
    2. Fügen Sie den Teil des XPath-Ausdrucks hinzu, der dem Element entspricht, das signiert oder verschlüsselt werden soll. Die Zeilen des XPath-Ausdrucks für häufig verwendete Elemente sind in der folgenden Liste dargestellt.
      • UsernameToken
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='UsernameToken']
      • BinarySecurityToken (LTPA, X.509, Kerberos usw..)
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='BinarySecurityToken']
      • SAML-1.1-Zusicherung (nur Verschlüsselung)
        /*[namespace-uri()='urn:oasis:names:tc:SAML:1.0:assertion' and local-name()='Assertion']
      • SAML-2.0-Zusicherung (nur Verschlüsselung)
        /*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:assertion' and local-name()='Assertion'] 
      • SecurityTokenReference im Sicherheitsheader (für STR-Transform)
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' 
        and local-name()='SecurityTokenReference']
      • SecurityTokenReference mit einem Signature-Element
        /*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#' and local-name()='Signature']
        /*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#' and local-name()='KeyInfo']
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='SecurityTokenReference']
      • Timestamp
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' and local-name()='Timestamp']
      • Signatur (nur Verschlüsselung)
        /*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#' and local-name()='Signature']
  2. Einen angepassten XPath-Ausdruck erstellen.
    1. Lokalisieren Sie das auszuwählende Element in der Struktur der SOAP-Nachricht.

      Die folgende SOAP-Nachricht enthält z. B. das Element CreditCardNumber.

      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <soapenv:Header>
          <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <ns1:myToken xmlns:ns1="http://token/space" value="tokenValue"/>
          </wsse:Security>
        </soapenv:Header>
        <soapenv:Body>
          <ns2:CreditCardNumber xmlns:ns2="http://bank/space" value="1234"/>
        </soapenv:Body>
      </soapenv:Envelope>

      Wenn Sie das Element CreditCardNumber auswählen möchten, isolieren Sie nur die umgebenden Elemente in der SOAP-Nachricht. Im folgenden Beispiel ist die Struktur der SOAP-Nachricht dargestellt, die relevant für die Auswahl des Elements CreditCardNumber ist.

      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
        <soapenv:Body>
          <ns2:CreditCardNumber xmlns:ns2="http://bank/space" value="1234"/>
        </soapenv:Body>
      </soapenv:Envelope>
    2. Schreiben Sie für jedes Element in der Struktur der SOAP-Nachricht, die das Zielelement enthält, ein XPath-Segment. Jedes XPath-Segment muss den Namespace und den lokalen Namen des entsprechenden Elements im folgenden Format enthalten:
      /*[namespace-uri()='http://namespace/url' and local-name()='Elementname']

      Beispielsweise entspricht das folgende XPath-Segment dem Element Envelope in dem im vorherigen Schritt angegebenen Beispiel.

      /*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Envelope']

      Wenn das Element keinen Namespace enthält, übernimmt es den Namespace des Elements, in dem es enthalten ist. Beispielsweise verwendet das Element Body den Namespace aus dem Element Envelope.

    3. Kombinieren Sie die XPath-Segmente zu einem vollständigen Ausdruck. Die Segmente sollten vom äußersten Element zum innersten Element hin angeordnet sein, wobei das innerste Element das Element ist, das Sie auswählen.

      Im folgenden Beispiel ist der vollständige XPath-Ausdruck dargestellt, der das Element CreditCardNumber aus dem Beispiel im ersten Schritt auswählt.

      /*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Envelope']
      /*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Body']
      /*[namespace-uri()='http://bank/space' and local-name()='CreditCardNumber']

Ergebnisse

Sie haben einen XPath-Ausdruck erstellt, der eine Element eines SOAP-1.1- oder SOAP-1.2-Nachrichtenheaders auswählt.

Beispiel

Im folgenden Beispiel ist ein vollständiger SOAP-1.2-XPath-Ausdruck dargestellt, der das Element UsernameToken auswählt.
/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' and local-name()='Envelope']
/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' and local-name()='Header']
/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='Security']
/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='UsernameToken']

Nächste Schritte

Geben Sie den vollständigen XPath-Ausdruck in der Konfiguration der WS-Security-Richtlinie als einzelne Textzeile ein.

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_wssec_xpath
Dateiname:twbs_wssec_xpath.html