Configurando Informações sobre Assinatura Utilizando a API WSSSignature

É possível proteger as mensagens SOAP, sem usar os conjuntos de política para configuração, utilizando as WSS APIs (Web Services Security APIs). Para configurar as informações sobre assinatura para as seções de ligação de gerador para o pedido do lado do cliente, utilize a API WSSSignature. A API WSSSignature faz parte do pacote com.ibm.websphere.wssecurity.wssapi.signature.

Antes de Iniciar

Você pode usar a API WSS ou configurar os conjuntos de política usando o console administrativo para ativar as informações de assinatura. Para proteger mensagens SOAP, você deve concluir as seguintes tarefas de assinatura:

  • Configure as informações sobre assinatura.
  • Escolha os métodos de assinatura.
  • Inclua ou altere partes assinadas, conforme necessário.

Sobre Esta Tarefa

O WebSphere Application Server utiliza as informações sobre assinatura para o gerador padrão para assinar partes da mensagem e utiliza a assinatura digital XML com os algoritmos existentes, como RSA-SHA1 e HMAC-SHA1.

A assinatura XML define muitos métodos para descrever informações-chave e permite a definição de um novo método. A canonicalização XML (C14N) geralmente é necessária ao usar a assinatura XML. As informações podem ser representadas de várias maneiras dentro de documentos XML serializados. O processo C14N é usado para efetuar canonicalização de informações XML. Selecione um algoritmo de C14N apropriado porque as informações que são convertidas para a forma canônica dependem desse algoritmo.

As informações de assinatura especificam as restrições de integridade que são aplicadas às mensagens geradas. As restrições incluem a especificação de quais partes da mensagem gerada devem ser assinadas digitalmente e as partes da mensagem nas quais devem ser anexados os elementos Nonce e de registro de data e hora assinados. As seguintes informações de partes de assinatura relacionada e assinatura são configuradas:

Tabela 1. Informações sobre Partes da Assinatura. Utilize as partes da assinatura para proteger mensagens.
Partes da Assinatura Description
keyword
Inclui a parte da assinatura usando palavras-chave. Use as seguintes palavras-chave para as partes da assinatura:
  • ADDRESSING_HEADERS
  • BODY
  • TIMESTAMP
Os cabeçalhos do WS-Addressing não são criptografados, mas podem ser assinados.
xpath Inclui uma parte da assinatura usando uma expressão XPath.
part Inclui um objeto WSSSignPart como um destino da parte da assinatura.
timestamp Inclui um objeto WSSTimestamp como um destino da parte da assinatura. Quando especificadas, as informações do registro de data e hora também especificarão quando a mensagem será gerada e expirada.
header Inclui o cabeçalho, especificado por QName, como um destino da parte da assinatura.
securityToken Inclui um objeto SecurityToken como um destino da parte da assinatura.

Para informações de assinatura, determinados comportamentos padrão ocorrem. A forma mais simples de usar a API WSSSignature é usar o comportamento padrão (veja o código de exemplo). Os valores padrão são definidos pela API WSS para o método de assinatura, o método de canonicalização, as referência do token de segurança e as partes da assinatura.

Tabela 2. Comportamentos Padrão da Assinatura. Vários comportamentos de assinatura são configurados por padrão.
Decisões de Assinatura Comportamento Padrão
Quais palavras-chave usar Configura as palavras-chave. O WebSphere Application Server suporta as seguintes palavras-chave por padrão:
  • ADDRESSING_HEADERS
  • BODY
  • TIMESTAMP
Qual método de assinatura usar Configura o algoritmo de assinatura. O método de assinatura padrão é RSA SHA1. O WebSphere Application Server suporta os seguintes métodos de assinatura pré-configurados:
  • WSSSignature.RSA_SHA1: http://www.w3.org/2000/09/xmldsig#rsa-sha1
  • WSSSignature.HMAC_SHA1: http://www.w3.org/2000/09/xmldsig#hmac-sha1
O método de assinatura digital DSA-SHA1 (http://www.w3.org/2000/09/xmldsig#dsa-sha1) não é suportado.
Qual método de canonicalização usar Configura o algoritmo de canonicalização. O método de canonicalização padrão é EXC C14N. O WebSphere Application Server suporta os seguintes métodos de canonicalização pré-configurados:
  • WSSSignature.EXC_C14N; http://www.w3.org/2001/10/xml-exc-c14n#
  • WSSSignature.C14N: http://www.w3.org/2001/10/xml-c14n#
A confirmação de assinatura é ou não solicitada Configura se a confirmação de assinatura será ou não solicitada. O valor padrão é false. A confirmação de assinatura é definida na especificação do OASIS Web Services Security Versão 1.1. Se requerido, o valor de confirmação da sua assinatura será armazenado para validar a confirmação de assinatura depois de receber novamente a mensagem que gerou a confirmação de assinatura na mensagem de resposta. Este método destina-se ao solicitante.
Qual token de segurança usar

Configura SecurityToken. O tipo de token especifica qual tipo de token usar para assinar e validar mensagens. O token X.509 é o tipo de token padrão.

O WebSphere Application Server fornece os seguintes tipos de token de consumidor pré-configurados:

  • Token de chave derivado
  • Tokens X509

Também é possível criar tipos de token customizados, conforme necessário.

Qual referência de token configurar Configura refType. SecurityToken.REF_STR é o valor padrão para o tipo de referência de token. O WebSphere Application Server suporta estes tipos de referências de token pré-configuradas:
  • SecurityToken.REF_STR
  • SecurityToken.REF_KEYID
  • SecurityToken.REF_EMBEDDED
  • SecurityToken.REF_THUMBPRINT

Se WSSSignature.requireSignatureConfirmation() for chamado, a API WSSSignature esperará que a mensagem de resposta inclua a confirmação de assinatura.

Procedimento

  1. Para configurar as informações sobre assinatura em uma mensagem SOAP utilizando a API WSS, primeiro assegure-se de que o servidor de aplicativos esteja instalado.
  2. Use a API WSSSignature para assinar as partes da mensagem e especificar os algoritmos em uma mensagem SOAP. O processo da API WSS para assinatura segue estas etapas:
    1. Usa WSSFactory.getInstance() para obter a instância de implementação da API WSS.
    2. Cria a instância WSSGenerationContext a partir da instância WSSFactory. WSSGenerationContext deve ser chamado em um aplicativo cliente JAX-WS.
    3. Cria SecurityToken a partir de WSSFactory para configurar a chave para assinatura.
    4. Cria WSSSignature a partir da instância WSSFactory usando SecurityToken. O comportamento padrão de WSSSignature é assinar estas partes da assinatura: BODY, ADDRESSING_HEADERS e TIMESTAMP.
    5. Inclui as partes que serão assinadas, se a parte padrão não for adequada. Se o método de compilação ou transformação for alterado, cria WSSSignPart e o inclui em WSSSignature.
    6. Cria WSSSignaturePart para WSSSignature. Chama o método requiredSignatureConfirmation(), se a confirmação de assinatura tiver que ser aplicada.
    7. Configura o método de canonicalização, se o padrão não for apropriado.
    8. Configura o método de assinatura, se o padrão não for apropriado.
    9. Configura a referência do token, se o padrão não for apropriado.
    10. Inclui WSSSignature em WSSGenerationContext.
    11. Chama WSSGenerationContext.process() com SOAPMessageContext.

Resultados

Você concluiu as etapas para configurar a assinatura para a seção do gerador das ligações. Se houver uma condição de erro ao assinar partes da mensagem, WSSException será fornecida. Em caso de êxito, WSSGenerationContext.process() será chamado e a segurança dos serviços da Web será aplicada à mensagem SOAP.

Exemplo

O seguinte exemplo fornece o código de amostra que usa métodos que são definidos na API WSSignature.

// Obter o contexto da mensagem
   Object msgcontext = getMessageContext();

// Generate the com.ibm.websphere.wssecurity.wssapi.WSSFactory instance  (step: a)
   WSSFactory factory = com.ibm.websphere.wssecurity.wssapi.WSSFactory.getInstance();

// Gerar a instância WSSGenerationContext (etapa: b)
   WSSGenerationContext gencont = factory.newWSSGenerationContext();

// Gerar o manipulador de retorno de chamada
   X509GenerateCallbackHandler callbackHandler = new 
       X509GenerateCallbackHandler(
       "",
       "dsig-sender.ks",
       "jks", 
       "client".toCharArray(), 
       "soaprequester", 
       "client".toCharArray(), 
       "CN=SOAPRequester, OU=TRL, O=IBM, ST=Kanagawa, C=JP", null);

// Gerar o token de segurança a ser usado para a assinatura  (etapa: c)
   SecurityToken token = factory.newSecurityToken(X509Token.class, 
        callbackHandler);

// Gerar a instância WSSSignature (etapa: d)
   WSSSignature sig = factory.newWSSSignature(token);

// Configurar a parte a ser assinada  (etapa: e)
// PADRÃO: WSSSignature.BODY, WSSSignature.ADDRESSING_HEADERS, 
//          e WSSSignature.TIMESTAMP.

// Configurar a parte no cabeçalho de SOAP especificado por QName (etapa: e)
      sig.addSignHeader(new 
                        QName("http://www.w3.org/2005/08/addressing", 
                        "MessageID"));

// Configurar a parte especificada pela palavra-chave (etapa: e)
      sig.addSignPart(WSSSignature.BODY);

// Configurar a parte especificada por SecurityToken (etapa: e)
   UNTGenerateCallbackHandler untCallbackHandler = new 
      UNTGenerateCallbackHandler("Chris", "sirhC");
      SecurityToken unt = factory.newSecurityToken(UsernameToken.class, 
         untCallbackHandler);
      sig.addSignPart(unt);

// Configurar a parte especificada por WSSSignPart  (etapa: e)
   WSSSignPart sigPart = factory.newWSSSignPart();
      sigPart.setSignPart(WSSSignature.TIMESTAMP);
      sigPart.setDigestMethod(WSSSignPart.SHA256);
      sig.addSignPart(sigPart);

// Configurar a parte especificada por WSSTimestamp  (etapa: e)
   WSSTimestamp timestamp = factory.newWSSTimestamp();
      sig.addSignPart(timestamp);

// Configurar a parte especificada pela expressão XPath (etapa: e) 
   StringBuffer sb = new StringBuffer();
      sb.append("/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' 
         e local-name()='Envelope']");
      sb.append("/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' 
         e local-name()='Body']");
      sb.append("/*[namespace-uri()='http://xmlsoap.org/Ping' 
         e local-name()='Ping']");
      sb.append("/*[namespace-uri()='http://xmlsoap.org/Ping' 
         e local-name()='Text']");
      sig.addSignPartByXPath(sb.toString());

// Configurar para aplicar a confirmação de assinatura  (etapa: f)
      sig.requireSignatureConfirmation();

// Configurar o método de canonicalização  (etapa: g)
// PADRÃO: WSSSignature.EXC_C14N
      sig.setCanonicalizationMethod(WSSSignature.C14N);

// Configurar o método de assinatura  (etapa: h)
// PADRÃO: WSSSignature.RSA_SHA1
      sig.setSignatureMethod(WSSSignature.HMAC_SHA1);

// Configurar a referência do token (etapa: i)
// PADRÃO: SecurityToken.REF_STR
      sig.setTokenReference(SecurityToken.REF_KEYID);
	
// Incluir WSSSignature em WSSGenerationContext  (etapa: j)
   gencont.add(sig);

// Gerar o cabeçalho de WS-Security  (etapa: k)
gencont.process(msgctx);
Nota: X509GenerationCallbackHandler precisa da senha da chave porque a chave pública é usada para assinatura.

O que Fazer Depois

Em seguida, escolha os métodos de algoritmo se quiser um método diferente dos valores padrão. Se os métodos de algoritmo não precisarem ser alterados, use a API WSSVerification para verificar a assinatura e especifique os métodos de algoritmo na seção do consumidor da ligação. Observe que a API WSSVerification só é suportada no consumidor da resposta (cliente).


Í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_confsignaturegen
Nome do arquivo: twbs_confsignaturegen.html