构建 WS-Security 的 XPath 表达式

JAX-RPC 和 JAX-WS WS-Security 配置使用基于 XML 的 SOAP 消息在应用程序之间交换信息。您可以使用 XPath 表达式来选择 SOAP 消息中的特定元素以进行签署或加密。

开始之前

如果要签署或加密简单对象访问协议 (SOAP) 消息中的元素,那么您可以使用 XPath 表达式来选择该消息中的特定元素。SOAP 1.1 消息与 SOAP 1.2 消息的格式不同,因此 SOAP 1.1 消息需要不同的 XPath 表达式来从每一个版本的消息中选择元素。JAX-WS 运行时环境同时支持 SOAP 1.1 和 SOAP 1.2,因此必须为您要选择的每一个元素都添加两个 XPath 表达式到 WS-Security 策略中:一个适用于 SOAP1.1,另一个适用于 SOAP 1.2。JAX-RPC 运行时环境仅支持 SOAP 1.1,因此必须将 SOAP 1.1 版本的 XPath 表达式添加到 WS-Security 策略中。

在用于从 JAX-WS WS-Security 配置中的 SOAP 消息中选择 Timestamp 元素的以下场景中,已突出显示了 SOAP 1.1 消息与 SOAP 1.2 消息在格式上的差异。

以下示例显示了包含 Timestamp 元素的 SOAP 1.1 消息。

<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>

以下示例显示了包含 Timestamp 元素的 SOAP 1.2 消息。

<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>

用于选择 SOAP 消息元素的 XPath 表达式位于 WS-Security 缺省策略中,该缺省策略包含 XML 数字签名的配置信息。在 JAX-WS WS-Security 配置中,XPath 表达式成对出现,每一个 XPath 表达式都对应于每一个受支持的 SOAP 版本。

以下示例显示了用于从上述示例中的 SOAP 1.1 消息和 SOAP 1.2 消息中选择 Timestamp 元素的 XPath 表达式。 第一个 XPath 表达式从 SOAP 1.1 消息中选择 Timestamp 元素,第二个 XPath 表达式从 SOAP 1.2 消息中选择 Timestamp 元素。

/*[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']

每一个版本的 XPath 表达式的前两行不同,但 XPath 表达式的最后两行相同。这两个 XPath 表达式之间的差异在于 Envelope 元素和 Header 元素的名称空间不同。XPath 表达式中的名称空间对应于 SOAP 1.1 消息和 SOAP 1.2 消息中的名称空间。

关于此任务

此项任务描述了如何构建用于选择元素以在 WS-Security 中签署或加密的 XPath 表达式。JAX-WS 安全性配置需要分别适用于 SOAP 1.1 和 SOAP 1.2 的不同 XPath 表达式,而 JAX-RPC 安全性配置则只需要适用于 SOAP 1.1 的 XPath 表达式。

如果要选择 WS-Security 中常用的 SOAP 消息元素,请参阅选项 1 来使用预先构建的代码段来构建 XPath 表达式。否则,请继续执行到选项 2 以了解如何为其他元素构建定制 XPath 表达式。

避免故障 避免故障: 为了使格式美观和表达清晰,此项任务中的 XPath 表达式示例呈多行显示。将已完成的 XPath 表达式添加到 WS-Security 中时,必须在同一行中输入完整的 XPath 表达式。gotcha

过程

  1. 使用预先构建的代码段来构建常用 XPath 表达式。
    1. 构建 XPath 表达式中用于指向 SOAP 安全性头的部件。
      • 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. 添加对应于您要签署或加密的元素的 XPath 表达式部件。 适用于常用元素的 XPath 表达式行显示在以下列表中。
      • 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 等。)
        /*[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 声明(仅限于加密)
        /*[namespace-uri()='urn:oasis:names:tc:SAML:1.0:assertion' and local-name()='Assertion']
      • SAML 2.0 声明(仅限于加密)
        /*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:assertion' and local-name()='Assertion'] 
      • 安全性头中的 SecurityTokenReference(适用于 STR-Transform)
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' 
        and local-name()='SecurityTokenReference'] 
      • Signature 元素中的 SecurityTokenReference
        /*[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']
      • 签名(仅限于加密)
        /*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#' and local-name()='Signature']
  2. 构建定制 XPath 表达式。
    1. 在 SOAP 消息的结构中找到您要选择的元素。

      例如,以下 SOAP 消息包含 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>

      如果要选择 CreditCardNumber,请只隔离其周围的 SOAP 消息元素。以下示例显示了与选择 CreditCardNumber 相关的 SOAP 消息的结构。

      <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. 为包含目标元素的 SOAP 消息结构中的每一个元素都编写一个 XPath 段。 每一个 XPath 段都必须包括其相应元素的名称空间和局部名,且格式如下所示:
      /*[namespace-uri()='http://namespace/url' and local-name()='ElementName']

      例如,以下 XPath 段对应于上一步示例中的 Envelope 元素。

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

      如果该元素不含名称空间,那么它将继承其父元素的名称空间。例如,Body 元素将使用 Envelope 元素的名称空间。

    3. 将 XPath 段组合成一个完整的表达式。 这些段的顺序应该是从最外层的元素至最内层的元素(即,您要选择的元素)。

      以下示例显示了用于从第一步的示例中选择 CreditCardNumber 元素的完整 XPath 表达式。

      /*[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']

结果

现在,已构建了用于选择 SOAP 1.1 消息头或 SOAP 1.2 消息头的元素的 XPath 表达式。

示例

以下示例显示了用于选择 UsernameToken 的完整 SOAP 1.2 XPath 表达式。
/*[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']

下一步做什么

将完整的 XPath 表达式以单行文本的形式输入到 WS-Security 策略配置中。

指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_wssec_xpath
文件名:twbs_wssec_xpath.html