Construindo Expressões XPath para WS-Security

As configurações do JAX-RPC e do WS-Security do JAX-WS usam mensagens SOAP baseada em XML para trocar informações entre os aplicativos. É possível usar uma expressão XPath para selecionar elementos específicos em uma mensagem SOAP a ser assinada ou criptografada.

Antes de Iniciar

Se desejar assinar ou criptografar elementos em uma mensagem SOAP (Simple Object Access Protocol), será possível usar as expressões XPath para selecionar os elementos específicos na mensagem. As mensagens SOAP 1.1 e SOAP 1.2 diferem em formato e, portanto, requerem expressões XPath separadas para selecionar elementos de cada versão da mensagem. O ambiente de tempo de execução JAX-WS suporta o SOAP 1.1 e SOAP 1.2., portanto você deve incluir duas expressões XPath nas políticas do WS-Security de cada elemento que deseja selecionar: um para o SOAP 1.1 e um para SOAP 1.2. O ambiente de tempo de execução JAX-RPC suporta somente o SOAP 1.1, portanto você deve incluir somente a versão SOAP 1.1 da expressão XPath para as políticas do WS-Security.

As diferenças no formato das mensagens SOAP 1.1 e SOAP 1.2 são destacadas no seguinte cenário de seleção do elemento Timestamp das mensagens SOAP em uma configuração do WS-Security do JAX-WS.

O seguinte exemplo mostra uma mensagem SOAP 1.1 com um elemento 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>

O seguinte exemplo mostra uma mensagem SOAP 1.2 com um elemento 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>

As expressões XPath que selecionam os elementos da mensagem SOAP estão nas políticas padrão do WS-Security que contêm informações de configuração para a Assinatura Digital XML. Em uma configuração do WS-Security do JAX-WS, as expressões XPath aparecem em pares, com uma expressão XPath para cada versão suportada do SOAP.

O seguinte exemplo mostra as expressões XPath que selecionam o elemento Timestamp a partir das mensagens SOAP 1.1 e SOAP 1.2 nos exemplos anteriores. A primeira expressão XPath seleciona o Timestamp da mensagem SOAP 1.1 e a segunda expressão XPath seleciona o Timestamp da mensagem 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']

As duas primeiras linhas das expressões XPath de cada versão são diferentes e as duas últimas linhas das expressões XPath são as mesmas. A diferença entre as duas expressões XPath é o namespace nos elementos Envelope e Header. Os namespaces nas expressões XPath correspondem aos namespaces nas mensagens SOAP 1.1 e SOAP 1.2.

Sobre Esta Tarefa

Esta tarefa descreve como construir expressões XPath usadas para selecionar um elemento para assinar ou criptografar no WS-Security. As configurações de segurança do JAX-WS separam as expressões XPath do SOAP 1.1 e SOAP 1.2, enquanto as configurações de segurança do JAX-RPC requerem expressões XPath somente para o SOAP 1.1.

Se desejar selecionar um elemento de mensagem SOAP normalmente usado no WS-Security, consulte a opção 1 para construir expressões XPath usando os segmentos do código pré-construídos. Do contrário, continue até a 2 para saber como construir expressões XPath customizadas para outros elementos.

Evitar Problemas Evitar Problemas: Os exemplos de expressão XPath nesta tarefa são mostrados em diversas linhas para fins de formatação e clareza. Ao incluir as expressões XPath concluídas no WS-Security, você deve inserir a expressão XPath completa como uma linha única.gotcha

Procedimento

  1. Construa uma expressão XPath comum usando segmentos de códigos pré-construídos.
    1. Construa a parte da expressão XPath que aponta para o cabeçalho de Segurança do 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. Inclua a parte da expressão XPath que corresponde ao elemento que deseja assinar ou criptografar. As linhas da expressão XPath para elementos usados normalmente são mostradas na seguinte lista.
      • 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 e assim por diante.)
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' and local-name()='BinarySecurityToken']
      • Asserção do SAML 1.1 (somente criptografia)
        /*[namespace-uri()='urn:oasis:names:tc:SAML:1.0:assertion' and local-name()='Assertion']
      • Asserção do SAML 2.0 (somente criptografia)
        /*[namespace-uri()='urn:oasis:names:tc:SAML:2.0:assertion' and local-name()='Assertion'] 
      • SecurityTokenReference no cabeçalho Security (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 um elemento 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']
      • Registro de data e hora
        /*[namespace-uri()='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd' and local-name()='Timestamp']
      • Assinatura (somente criptografia)
        /*[namespace-uri()='http://www.w3.org/2000/09/xmldsig#' and local-name()='Signature']
  2. Construa uma expressão XPath customizada.
    1. Localize o elemento que deseja selecionar na estrutura da mensagem SOAP.

      Por exemplo, a seguinte mensagem SOAP contém o 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>

      Se desejar selecionar CreditCardNumber, isole somente os elementos da mensagem SOAP que o circunda. O seguinte exemplo mostra a estrutura da mensagem SOAP que é relevante na seleção de 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. Escreva um segmento XPath para cada elemento na estrutura da mensagem SOAP que contém o elemento de destino. Cada segmento XPath deve conter o namespace e o nome local de seu elemento correspondente colocados no seguinte formato:
      /*[namespace-uri()='http://namespace/url' and local-name()='ElementName']

      Por exemplo, o seguinte segmento XPath corresponde ao elemento Envelope do exemplo na etapa anterior.

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

      Se o elemento não contiver um namespace, ele herdará o namespace do elemento que o contém. Por exemplo, o elemento Body usa o namespace do elemento Envelope.

    3. Combine os segmentos XPath em uma expressão completa. Os segmentos devem ser classificados do elemento mais externo para o elemento mais interno, que é o elemento que está selecionando.

      O seguinte exemplo mostra a expressão XPath completa que seleciona o elemento CreditCardNumber do exemplo na primeira etapa.

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

Resultados

Você constrói uma expressão XPath que seleciona um elemento do cabeçalho da mensagem SOAP 1.1 ou SOAP 1.2.

Exemplo

O seguinte exemplo mostra uma expressão XPath completa do SOAP 1.2 que seleciona um 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']

O que Fazer Depois

Insira a expressão XPath completa na configuração de política do WS-Security como uma linha de texto única.

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_wssec_xpath
Nome do arquivo: twbs_wssec_xpath.html