Construction d'expressions XPath pour WS-Security

Les configurations JAX-RPC et JAX-WS WS-Security utilisent des messages SOAP reposant sur XML pour échanger des informations entre les applications. Vous pouvez vous servir d'une expression XPath pour sélectionner des éléments spécifiques dans un message SOAP en vue de leur signature ou de leur chiffrement.

Avant de commencer

Pour signer ou chiffrer des éléments dans un message SOAP (Simple Object Access Protocol), vous pouvez utiliser des expressions XPath afin de sélectionner les éléments de votre choix dans le message. Les messages SOAP 1.1 et SOAP 1.2 ont un format différent. Par conséquent, des expressions XPath distinctes sont requises pour la sélection des éléments dans chaque version de message. L'environnement d'exécution JAX-WS prend en charge SOAP 1.1 et SOAP 1.2. Ainsi, vous devez ajouter deux expressions XPath aux règles WS-Security pour chaque élément que vous voulez sélectionner : une pour SOAP 1.1 et une pour SOAP 1.2. L'environnement d'exécution JAX-RPC ne prend en charge que SOAP 1.1. Ainsi, il suffit d'ajouter la version SOAP 1.1 de l'expression XPath aux règles WS-Security.

Les différences de format entre les messages SOAP 1.1 et SOAP 1.2 sont mises en évidence dans le scénario ci-dessous, dans lequel l'élément Timestamp est sélectionné dans des messages SOAP, dans une configuration JAX-WS WS-Security.

L'exemple ci-dessous illustre un message SOAP 1.1 comportant un élément Timestamp.

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

L'exemple ci-dessous illustre un message SOAP 1.2 comportant un élément Timestamp.

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

Les expressions XPath qui sélectionnent des éléments de message SOAP se trouvent dans les règles WS-Security par défaut contenant des informations de configuration pour la signature numérique XML. Dans une configuration JAX-WS WS-Security, les expressions XPath apparaissent par paires (une expression XPath pour chaque version prise en charge de SOAP).

L'exemple ci-dessous illustre les expressions XPath qui sélectionnent l'élément Timestamp dans les messages SOAP 1.1 et SOAP 1.2 des exemples précédents. La première expression XPath sélectionne l'élément Timestamp dans le message SOAP 1.1 et la deuxième expression XPath sélectionne l'élément Timestamp dans le message SOAP 1.2.

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

Les deux premières lignes des expressions XPath sont différentes selon la version, et les deux dernières lignes sont identiques. La différence entre les deux expressions XPath est l'espace de nom dans les éléments Envelope et Header. Les espaces de nom dans les expressions XPath correspondent aux espaces de nom dans les messages SOAP 1.1 et SOAP 1.2.

Pourquoi et quand exécuter cette tâche

Cette tâche explique comment construire des expressions XPath permettant de sélectionner un élément à signer ou à chiffrer dans WS-Security. Les configurations de sécurité JAX-WS requièrent des expressions XPath distinctes pour SOAP 1.1 et SOAP 1.2, alors que les configurations de sécurité JAX-RPC requièrent des expressions XPath pour SOAP 1.1 seulement.

Si vous voulez sélectionner un élément de message SOAP souvent utilisé dans WS-Security, reportez-vous à l'option 1 afin de construire des expressions XPath avec des segments de code prégénérés. Sinon, passez à l'option 2 pour apprendre à construire des expressions XPath pour d'autres éléments.

Eviter les incidents Eviter les incidents: Les exemples d'expression XPath figurant dans cette tâche apparaissent sur plusieurs lignes pour une meilleure lisibilité. Lorsque vous ajoutez vos expressions XPath complètes à WS-Security, vous devez les entrer sur une seule ligne.gotcha

Procédure

  1. Construisez une expression XPath commune avec des segments de code prégénérés.
    1. Construisez la partie de l'expression XPath qui désigne l'en-tête de sécurité 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. Ajoutez la partie de l'expression XPath qui correspond à l'élément à signer ou à chiffrer. Les lignes de l'expression XPath des éléments souvent utilisés apparaissent dans la liste ci-dessous.
      • UsernameToken (Jeton de nom d'utilisateur)
        /*[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, etc.)
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='BinarySecurityToken']
      • Assertion SAML 1.1 (chiffrement uniquement)
        /*[namespace-uri()='urn:oasis:names:tc:SAML:1.0:assertion' and local-name()='Assertion']
      • Assertion SAML 2.0 (chiffrement uniquement)
        /*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:assertion' and local-name()='Assertion'] 
      • SecurityTokenReference dans l'en-tête de sécurité (pour 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 dans un élément de signature
        /*[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']
      • Signature (chiffrement uniquement)
        /*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#' and local-name()='Signature']
  2. Construisez une expression XPath personnalisée.
    1. Localisez l'élément à sélectionner dans la structure du message SOAP.

      Par exemple, le message SOAP suivant contient l'élément 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 vous voulez sélectionner CreditCardNumber, isolez uniquement les éléments du message SOAP qui l'entourent. L'exemple ci-dessous illustre la structure du message SOAP pertinente pour la sélection de l'élément 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. Rédigez un segment XPath pour chaque élément figurant dans la structure du message SOAP et contenant l'élément cible. Chaque segment XPath doit inclure l'espace de nom et le nom local de son élément correspondant au format suivant :
      /*[namespace-uri()='http://namespace/url' and local-name()='ElementName']

      Par exemple, le segment XPath ci-dessous correspond à l'élément Envelope de l'exemple présenté à l'étape précédente.

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

      Si l'élément ne contient pas d'espace de nom, il hérite de l'espace de nom de l'élément qui le contient. Par exemple, l'élément Body utilise l'espace de nom de l'élément Envelope.

    3. Combinez les segments XPath en une expression complète. Les segments doivent être ordonnés de l'élément le plus vers l'extérieur vers l'élément le plus vers l'intérieur, c'est-à-dire l'élément que vous sélectionnez.

      L'exemple ci-dessous illustre l'expression XPath complète qui sélectionne l'élément CreditCardNumber figurant dans l'exemple de la première étape.

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

Résultats

Vous avez construit une expression XPath qui sélectionne un élément d'un en-tête de message SOAP 1.1 ou SOAP 1.2.

Exemple

L'exemple ci-dessous illustre une expression XPath SOAP 1.2 complète qui sélectionne un élément UsernameToken.
/*[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']

Que faire ensuite

Entrez l'expression XPath complète dans la configuration des règles WS-Security sur une seule ligne.

Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_wssec_xpath
Nom du fichier : twbs_wssec_xpath.html