Verificando a Assinatura Usando a API WSSVerification

É 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 verificar as informações de assinatura para as seções de ligação do consumidor do pedido do cliente, use a API WSSVerification. Você também deve especificar quais métodos de algoritmo e quais partes da assinatura da mensagem SOAP devem ser verificados. A API WSSVerification faz parte do pacote com.ibm.websphere.wssecurity.wssapi.verification.

Antes de Iniciar

Use as APIs WSS ou configure os conjuntos de política usando o console administrativo para verificar as informações de assinatura. Para oferecer segurança às mensagens SOAP, você deve ter concluído as seguintes tarefas de assinatura:

  • Configure as informações de assinatura.
  • Escolha os métodos de algoritmo para a verificação de assinatura e da assinatura.
  • Verifique as informações de assinatura.

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.

A tabela a seguir mostra as informações obrigatórias e opcionais sobre ligação quando a restrição de segurança de assinatura digital (integridade) for definida.

Tabela 1. Partes da verificação de assinatura. Utilize as partes de verificação de assinatura para proteger mensagens.
Partes da Verificação Description
keywords
Inclui partes obrigatórias da assinatura como destinos da verificação usando palavras-chave. Partes de mensagens diferentes podem ser especificadas na proteção de mensagem para pedido no gerador. Use as seguintes palavras-chave para as partes obrigatórias da verificação de assinatura:
  • ADDRESSING_HEADERS
  • BODY
  • TIMESTAMP
Os cabeçalhos do WS-Addressing não são criptografados, mas podem ser assinados.
xpath Inclui partes da verificação usando uma expressão XPath.
part Inclui o objeto WSSVerifyPart como uma parte da verificação.
header Inclui o cabeçalho, especificado por QName, como uma parte da verificação.

Para informações de verificação de assinatura, determinados comportamentos ocorrem. A forma mais simples de usar a API WSSVerification é usar o comportamento padrão.

Os valores padrão são definidos pela API WSS para o método de compilação, o método de transformação, o token de segurança e as partes obrigatórias da verificação.

Tabela 2. Comportamentos Padrão da Verificação de Assinatura. Várias características das partes de verificação de assinatura são configuradas por padrão.
Decisões da Verificação de Assinatura Comportamento Padrão
Qual método de assinatura usar (algorithm) Configura o método do algoritmo de assinatura. Tanto a criptografia de dados quanto a assinatura e a canonicalização podem ser especificadas. O método de assinatura padrão é RSA SHA1. O WebSphere Application Server suporta os seguintes métodos de assinatura pré-configurados:
  • WSSVerification.RSA_SHA1: http://www.w3.org/2000/09/xmldsig#rsa-sha1
  • WSSVerification.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 (algorithm) Configura o método do algoritmo de canonicalização. Tanto a criptografia de dados quanto a assinatura e a canonicalização podem ser especificadas. O método de assinatura padrão é EXC_C14N. O WebSphere Application Server suporta os seguintes métodos de canonicalização pré-configurados:
  • WSSVerification.EXC_C14N: http://www.w3.org/2001/10/xml-exc-c14n#
  • WSSVerification.C14N: http://www.w3.org/2001/10/xml-c14n#
A confirmação de assinatura é ou não solicitada Se a API WSSSignature especificar que a confirmação de assinatura é requerida, a API WSSVerification verificará então o valor de confirmação da assinatura na mensagem de resposta que tem o valor de confirmação da assinatura anexado a ela quando recebido. A confirmação de assinatura é definida na especificação do OASIS Web Services Security Versão 1.1.

A configuração de assinatura padrão é false.

Qual token de segurança especificar (securityToken)

Inclui o objeto securityToken como uma parte da assinatura. O WebSphere Application Server configura as informações de token a serem utilizadas para verificação.

O WebSphere Application Server suporta os seguintes tokens pré-configurados para assinatura:

  • Token X.509
  • Token de chave derivado
As informações requeridas para os tokens incluem a classe do token, as informações do manipulador de retorno de chamada e o nome do módulo de login de JAAS.

Procedimento

  1. Para verificar a assinatura em uma mensagem SOAP utilizando a API WSSVerification, primeiro assegure-se de que o servidor de aplicativos esteja instalado.
  2. Use a API WSSVerification para configurar as partes da mensagem a serem verificadas e para especificar os algoritmos em uma mensagem SOAP. O processo da API WSS para a verificação de assinatura segue estas etapas:
    1. Usa WSSFactory.getInstance() para obter a instância de implementação da API WSS.
    2. Cria a instância do WSSConsumingContext a partir da instância do WSSFactory.
    3. Assegura que o WSSConsumingContext seja chamado na classe de implementação do Provedor JAX-WS. Devido à natureza do modelo de programação JAX-WS, um provedor JAX-WS precisa ser implementado e deve chamar o WSSConsumingContext para verificar a assinatura da mensagem SOAP.
    4. Cria WSSVerification a partir da instância WSSFactory.
    5. Inclui a parte a ser verificada. Se o método de compilação ou de transformação forem alterados, crie WSSVerifyPart e o configure em WSSVerification.
    6. Configura os candidatos ao método de canonicalização, se o padrão não for adequado.
    7. Configura os candidatos do método de assinatura, se o padrão não for adequado.
    8. Configura o token de segurança do candidato, se o padrão não for adequado.
    9. Chama requireSignatureConfirmation(), se a confirmação de assinatura for aplicada.
    10. Inclui WSSVerification no WSSConsumingContext.
    11. Chama WSSConsumingContext.process() com o contexto da mensagem SOAP.

Resultados

Você concluiu as etapas para verificar a assinatura para a seção do consumidor das ligações. Se houver uma condição de erro, uma WSSException será fornecida. Em caso de êxito, WSSConsumingContext.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 WSSVerification:

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

// Gerar a instância do WSSFactory (etapa: a)
   WSSFactory factory = WSSFactory.getInstance();		

// Gerar a instância do WSSConsumingContext (etapa: b)
   WSSConsumingContext concont = factory.newWSSConsumingContext();


// Gerar a lista de certificado
	 String certpath = "c:/WebSphere/AppServer/etc/ws-security/samples/intca2.cer";
// O local do arquivo de certificado X509
	 X509Certificate x509cert = null;
	    try {
		    InputStream is = new FileInputStream(certpath);
		    CertificateFactory cf = CertificateFactory.getInstance("X.509");
		    x509cert = (X509Certificate)cf.generateCertificate(is);
	      } catch(FileNotFoundException e1){
		      throw new WSSException(e1);
	      } catch (CertificateException e2) {
		      throw new WSSException(e2);
	      }
      Set<Object> eeCerts = new HashSet<Object>();
	      eeCerts.add(x509cert);  
// Criar o armazenamento de certificados
	  java.util.List<CertStore> certList = new java.util.ArrayList<CertStore>();
	  CollectionCertStoreParameters certparam = new CollectionCertStoreParameters(eeCerts);
	  CertStore cert = null;
	  try {
		  cert = CertStore.getInstance("Collection", certparam, "IBMCertPath");
	  } catch (NoSuchProviderException e1) {
		  throw new WSSException(e1);
	  } catch (InvalidAlgorithmParameterException e2) {
		  throw new WSSException(e2);
	  } catch (NoSuchAlgorithmException e3) {
		  throw new WSSException (e3);
	  }
	  if(certList != null ){
		  certList.add(cert);
	  }
// Gerar o manipulador de retorno de chamada
	  X509ConsumeCallbackHandler callbackHandler = new X509ConsumeCallbackHandler(
			  "dsig-receiver.ks", 
			  "jks",
			  "server".toCharArray(), 
			  certList, 
			  java.security.Security.getProvider("IBMCertPath")
	  );

// Gerar a instância de WSSVerification (etapa: d)
	 WSSVerification ver = factory.newWSSVerification(X509Token.class, callbackHandler);

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

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

// Configurar a parte a ser especificada pela palavra-chave (etapa: e)
	    ver.addRequiredVerifyPart(WSSVerification.BODY);

// Configurar a parte a ser especificada pelo WSSVerifyPart (etapa: e)
	 WSSVerifyPart verPart = factory.newWSSVerifyPart();
	    verPart.setRequiredVerifyPart(WSSVerification.BODY);
	    verPart.addAllowedDigestMethod(WSSVerifyPart.SHA256);
	    ver.addRequiredVerifyPart(verPart);

// 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']");		
	    ver.addRequiredVerifyPartByXPath(sb.toString());


// Configurar um ou mais candidatos de métodos de canonicalização para verificação (etapa: f)
// DEFAULT : WSSVerification.EXC_C14N
	   ver.addAllowedCanonicalizationMethod(WSSVerification.C14N);
	   ver.addAllowedCanonicalizationMethod(WSSVerification.EXC_C14N);

// Configurar um ou mais candidatos de métodos de assinatura para verificação (etapa: g)
// DEFAULT : WSSVerification.RSA_SHA1
	   ver.addAllowedSignatureMethod(WSSVerification.HMAC_SHA1);

// Configurar o token de segurança do candidato para verificação (etapa: h)
	 X509ConsumeCallbackHandler callbackHandler2 = getCallbackHandler2();
	   ver.addToken(X509Token.class, callbackHandler2);


// Configurar o sinalizador para solicitar a confirmação de assinatura (etapa: i)
	  ver.requireSignatureConfirmation();

// Incluir WSSVerification em WSSConsumingContext (etapa: j)
	 concont.add(ver);

//Validar o cabeçalho do WS-Security (etapa: k)
concont.process(msgcontext);

O que Fazer Depois

Depois de verificar a assinatura e configurar os métodos do algoritmo para a mensagem SOAP, você pode configurar o método de compilação ou transformação. Se desejar configurar esses métodos, use a API WSSVerifyPart ou configure os conjuntos de política usando o console administrativo.


Í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_confsignaturecon
Nome do arquivo: twbs_confsignaturecon.html