Creación de expresiones XPath para WS-Security

Las configuraciones de WS-Security JAX-RPC y JAX-WS utilizan mensajes SOAP basados en XML para intercambiar información entre aplicaciones. Puede utilizar una expresión XPath para seleccionar elementos específicos en un mensaje SOAP a firmar o cifrar.

Antes de empezar

Si desea firmar o cifrar elementos en un mensaje SOAP (Simple Object Access Protocol - Protocolo de acceso a objetos simple), puede utilizar expresiones XPath para seleccionar los elementos específicos en el mensaje. Los mensajes SOAP 1.1 y SOAP 1.2 difieren en cuanto al formato y, por lo tanto, requieren distintas expresiones XPath para seleccionar elementos de cada versión del mensaje. El entorno de ejecución de JAX-WS admite tanto SOAP 1.1 como SOAP 1.2., por lo que deberá añadir dos expresiones XPath en las políticas de WS-Security para cada elemento que desee seleccionar: una para SOAP 1.1 y otra para SOAP 1.2. El entorno de ejecución de JAX-RPC solamente admite SOAP 1.1, por lo que deberá añadir sólo la versión de SOAP 1.1 de la expresión XPath en las políticas de WS-Security.

Las diferencias en el formato de los mensajes SOAP 1.1 y SOAP 1.2 se resaltan en el escenario siguiente para seleccionar el elemento de indicación de los mensajes SOAP en una configuración de JAX-WS WS-Security.

En el ejemplo siguiente se muestra un mensaje SOAP 1.1 con un elemento de indicación de fecha y hora.

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

En el ejemplo siguiente se muestra un mensaje SOAP 1.2 con un elemento de indicación de fecha y hora.

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

Las expresiones XPath que seleccionan elementos de mensajes SOAP se hallan en las políticas predeterminadas de WS-Security que contienen información de configuración para la Firma digital XML. En una configuración de JAX-WS WS-Security, las expresiones XPath aparecen en pares, con una expresión XPath para cada versión soportada de SOAP.

En el ejemplo siguiente se muestran las expresiones XPath que seleccionan el elemento de indicación de fecha y hora de los mensajes SOAP 1.1 y SOAP 1.2 en los ejemplos anteriores. La primera expresión XPath selecciona la indicación de fecha y hora del mensaje de SOAP 1.1 y la segunda expresión XPath selecciona la indicación de fecha y hora del mensaje SOAP 1.2.

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

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

Las dos primeras líneas de las expresiones XPath de cada versión son diferentes y las dos últimas líneas de las expresiones XPath son iguales. La diferencia entre las dos expresiones XPath es el espacio de nombres en los elementos Sobre y Cabecera. Los espacios de nombres en las expresiones XPath corresponden a los espacios de nombres en los mensajes SOAP 1.1 y SOAP 1.2.

Acerca de esta tarea

En esta tarea se describe cómo crear expresiones XPath que se utilizan para seleccionar un elemento para firmar o cifrar en WS-Security. Las configuraciones de seguridad JAX-WS requieren distintas expresiones XPath para SOAP 1.1 y SOAP 1.2, mientras que las configuraciones de seguridad JAX-RPC requieren expresiones XPath solamente para SOAP 1.1.

Si desea seleccionar un elemento de mensaje SOAP que se suele utilizar en WS-Security, consulte la opción 1 para crear expresiones XPath utilizando segmentos de código precompilado. De lo contrario, continúe con la opción 2 para obtener información sobre cómo crear expresiones XPath para otros elementos.

Avoid trouble Avoid trouble: Los ejemplos de expresiones XPath en esta tarea se muestran en varias líneas para ejemplificar el formato de forma clara. Cuando añade sus expresiones XPath completadas a WS-Security, debe escribir la expresión XPath completa en una sola línea.gotcha

Procedimiento

  1. Creación de una expresión XPath común utilizando segmentos de código precompilado.
    1. Creación de la parte de la expresión XPath que apunta a la cabecera de seguridad SOAP.
      • SOAP 1.1:
        /*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' y local-name()='Envelope']
        /*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' y local-name()='Header']
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' y local-name()='Security']
      • SOAP 1.2:
        /*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' y local-name()='Envelope']
        /*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' y local-name()='Header']
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' y local-name()='Security']
    2. Añada la parte de la expresión XPath que corresponda al elemento que desee firmar o cifrar. En la siguiente lista se muestran las líneas de la expresión XPath de los elementos utilizados frecuentemente.
      • UsernameToken
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' y local-name()='UsernameToken']
      • BinarySecurityToken (LTPA, X.509, Kerberos, etcétera.)
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='BinarySecurityToken']
      • Aserción SAML 1.1 (sólo cifrado)
        /*[namespace-uri()='urn:oasis:names:tc:SAML:1.0:assertion' y local-name()='Assertion']
      • Aserción SAML 2.0 (sólo cifrado)
        /*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:assertion' y local-name()='Assertion']
      • SecurityTokenReference en la cabecera de seguridad (para 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 dentro de un elemento de firma
        /*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#' and local-name()='Signature']
        /*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#' y local-name()='KeyInfo']
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' y local-name()='SecurityTokenReference']
      • Timestamp
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' y local-name()='Timestamp']
      • Firma (sólo cifrado)
        /*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#' y local-name()='Signature']
  2. Creación de una expresión XPath personalizada.
    1. Busque el elemento que desea seleccionar dentro de la estructura del mensaje SOAP.

      Por ejemplo, el siguiente mensaje SOAP contiene el elemento 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>

      Si desea seleccionar CreditCardNumber, aísle sólo los elementos del mensaje SOAP que lo rodean. En el ejemplo siguiente se muestra la estructura del mensaje SOAP que es importante para seleccionar CreditCardNumber.

      <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. Escriba un segmento XPath para cada elemento en la estructura de mensajes SOAP que contiene el elemento de destino. Cada segmento XPath debe incluir el nombre de espacio y el nombre local del correspondiente elemento en el formato siguiente:
      /*[namespace-uri()='http://namespace/url' y local-name()='ElementName']

      Por ejemplo, el siguiente segmento XPath corresponde al elemento Sobre del ejemplo del paso anterior.

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

      Si el elemento no contiene un espacio de nombres, éste hereda el espacio de nombres del elemento que lo contiene. Por ejemplo, el elemento Cuerpo utiliza el espacio de nombres del elemento Sobre.

    3. Combinación de los segmentos XPath en una expresión completa. Los segmentos se deben ordenar desde el elemento más externo al elemento más interno, que es el elemento que se está seleccionando.

      En el ejemplo siguiente se muestra la expresión XPath completa que selecciona el elemento CreditCardNumber del ejemplo en el primer paso.

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

Resultados

Ha creado una expresión XPath que selecciona un elemento de una cabecera de mensaje SOAP 1.1 o SOAP 1.2.

Ejemplo

En el ejemplo siguiente se muestra una expresión XPath de SOAP 1.2 completa que selecciona un UsernameToken.
/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' y local-name()='Envelope']
/*[namespace-uri()='http://www.w3.org/2003/05/soap-envelope' y local-name()='Header']
/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' y local-name()='Security']
/*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' y local-name()='UsernameToken']

Qué hacer a continuación

Escriba la expresión XPath completa en la configuración de la política de WS-Security en una sola línea de texto.

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_wssec_xpath
File name: twbs_wssec_xpath.html