Solicitando Tokens sender-vouches SAML a Partir de um STS Externo Usando APIs do WSS e Proteção no Nível da Mensagem

É possível pedir tokens SAML com o método de confirmação de assunto de sender-vouches a partir de um Security Token Service (STS) externo. Após obter o token sender-vouches SAML, é possível enviar estes tokens com mensagens de solicitação de serviços da web usando o modelo de programação Java™ API for XML-Based Web Services (JAX-WS) e Web Services Security APIs (WSS API) com a proteção no nível da mensagem.

Antes de Iniciar

Essa tarefa assume que você é familiarizado com o modelo de programação JAX-WS, as interfaces API WSS, os conceitos de SAML, proteção de transporte SSL, token de segurança X.509 e o uso dos conjuntos de política para configurar e administrar as configurações dos serviços da Web.

Sobre Esta Tarefa

É possível solicitar um token SAML com o método de confirmação de assunto sender-vouches a partir de um STS externo e, em seguida, enviar o token SAML nas mensagens de solicitação de serviços da web a partir de um cliente de serviços da web usando WSS APIs com a proteção no nível da mensagem.

Esse produto não fornece um conjunto de políticas padrão que requer tokens SAML com método de confirmação de assunto de sender-vouches. Consulte sobre a configuração das ligações de cliente e provedor para o token sender-vouches SAML para saber mais sobre como criar uma política de Segurança de Serviços da Web para requerer tokens SAML com confirmação de assunto de sender-vouches e como criar uma configuração de ligação customizada. Você deve conectar a política e a ligação ao provedor de serviços da Web. A amostra de código descrita nessa tarefa assume que a política do provedor de serviços da Web requer que ambos os tokens SAML e os corpos de mensagem sejam assinados digitalmente usando um token de segurança X.509.

O aplicativo cliente de serviços da Web usado nessa tarefa é uma versão modificada do código do cliente que está contida no aplicativo de amostra JaxWSServicesSamples que está disponível para download. Fragmentos de código da amostra são descritos na seção de procedimento, e uma amostra de cliente de serviços da Web completa e pronta para usar é fornecida.

Procedimento

  1. Identifique e obtenha o cliente de serviços da Web que deseja usar para chamar um provedor de serviços da Web.

    Use esse cliente para inserir tokens SAML em mensagens de pedido SOAP programaticamente usando APIs WSS.

    O cliente de serviço da Web usado nesse procedimento é uma versão modificada do código do cliente que está contida no aplicativo de amostra de serviços da Web JaxWSServicesSamples.

    Para obter e modificar o cliente dos serviços da Web de amostra para incluir a API de Segurança de Serviços da Web para passar tokens sender-vouches SAML em mensagens de pedido SOAP programaticamente usando APIs WSS, conclua as seguintes etapas:

    1. Fazer download do aplicativo de amostra JaxWSServicesSamples. A amostra JaxWSServicesSamples não é instalada por padrão.
    2. Obter o código do cliente JaxWSServicesSamples.

      Para propósitos de exemplo, esse procedimento usa uma versão modificada da amostra do thin client Echo que está incluída na amostra JaxWSServicesSamples. O arquivo de amostra do thin client Echo dos serviços da Web, SampleClient.java, está localizado no diretório src\SampleClientSei\src\com\ibm\was\wssample\sei\cli. O arquivo de classe de amostra é incluído no arquivo WSSampleClientSei.jar.

      O aplicativo corporativo JaxWSServicesSamples.ear e os arquivos Java Archives de suporte estão localizados no diretório installableApps no aplicativo de amostra JaxWSServicesSamples.

    3. Implementar o arquivo JaxWSServicesSamples.ear no servidor de aplicativos. Após implementar o arquivo JaxWSServicesSamples.ear, você está pronto para testar o código do cliente de serviços da Web de amostra em relação ao aplicativo de amostra.

    Em vez de usar a amostra do cliente de serviços da Web, é possível escolher incluir os fragmentos de código para passar tokens SAML em mensagens de pedido SOAP programaticamente usando APIs WSS em seu próprio aplicativo de cliente de serviços da Web. O exemplo nesse procedimento usa um thin cliente de serviços da Web JAX-WS; porém, também é possível usar um cliente gerenciado.

  2. Especifique o uso da proteção de mensagem de nível de mensagem SSL. Use a seguinte propriedade JVM para especificar o uso do SSL para proteger o pedido de token SAML com o STS:
    -Dcom.ibm.SSL.ConfigURL=file:profile_root\properties\ssl.client.props
    Alternativamente, é possível definir o arquivo de configuração SSL usando uma propriedade do sistema Java no código do cliente de amostra; por exemplo:
    System.setProperty("com.ibm.SSL.ConfigURL", "file:profile_root/properties/ssl.client.props");
  3. Inclua o arquivo JAR Thin Client para JAX-WS no caminho de classe. Inclua o arquivo app_server_root/runtimes/com.ibm.jaxws.thinclient_8.5.0.jar no caminho da classe. Consulte as informações sobre o teste dos clientes ativados para serviços da Web para obter informações adicionais sobre como incluir esse arquivo JAR no caminho da classe.
  4. Peça o token SAML de um STS externo. O seguinte fragmento de código ilustra como pedir o token sender-vouches SAML e assume que um STS externo está configurado para aceitar um token Username, e para emitir um token SAML 2.0 usando sender-vouches após validação:
    //Pedir o SAML Token a partir de STS externo
    WSSFactory factory = WSSFactory.getInstance();
    sequência STS_URI  = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
    Sequência ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
    WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
    WSSConsumingContext concont1 = factory.newWSSConsumingContext(); 
    HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
    cbackMap1.put(SamlConstants.STS_ADDRESS, STS_URI);
    cbackMap1.put(SamlConstants.SAML_APPLIES_TO, ENDPOINT_URL);
    cbackMap1.put(SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
    cbackMap1.put(SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
    cbackMap1.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML11_VALUE_TYPE);
    cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");
    
    SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);
    
    // Incluir UNT ao pedido de confiança
    UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
    SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);
    
    gencont1.add(ut);
    
    cbHandler1.setWSSConsumingContextForTrustClient(concont1);
    cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
    SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, cbHandler1, "system.wss.generate.saml");
    
    System.out.println("SAMLToken id = " + samlToken.getId());
    1. Use o método WSSFactory newSecurityToken para especificar como pedir um token SAML de um STS externo.
      Especifique o seguinte método para criar o token SAML:
      WSSFactory  newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml")
      Solicitar um token SAML requer a permissão de segurança Java wssapi.SAMLTokenFactory.newSAMLToken. Use a Ferramenta de Política para incluir a seguinte instrução de política ao arquivo de política de segurança Java ou ao arquivo was.policy do aplicativo cliente:
      permission java.security.SecurityPermission "wssapi.SAMLTokenFactory.newSAMLToken"

      O parâmetro SAMLToken.class especifica o tipo de token de segurança a criar.

      O objeto callbackHandler contém parâmetros que definem as características do token SAMLToken que você está pedindo e outros parâmetros necessários para atingir o STS e obter o token SAML. O objeto SAMLGenerateCallbackHandler especifica os parâmetros de configuração descritos na tabela a seguir:
      Tabela 1. Propriedades SAMLGenerateCallbackHandler. Essa tabela descreve os parâmetros de configuração para o objeto SAMLGenerateCallbackHandler usando o método de confirmação de assunto de sender-vouches.
      Propriedade Descrição Required
      SamlConstants.CONFIRMATION_METHOD Especifica para usar o método de confirmação sender-vouches. Sim
      SamlConstants.TOKEN_TYPE

      Especifica o tipo de token.

      Quando um cliente de serviços da Web tem conexões de conjunto de políticas, essa propriedade não é usada pelos ambiente de tempo de execução da Segurança de Serviços da Web.

      Especifique o tipo de valor de token usando o atributo valueType da configuração de ligação tokenGenerator.

      O exemplo nesse procedimento usa um token SAML 1.1; porém, também é possível usar o valor WSSConstants.SAML.SAML20_VALUE_TYPE.

      Sim
      SamlConstants.STS_ADDRESS

      Especifica o endereço do Security Token Service.

      Para o exemplo usado nesse tópico de tarefa, o valor dessa propriedade é configurado para https para especificar o uso do SSL para proteger o pedido de Token SAML.

      Você deve configurar a propriedade -Dcom.ibm.SSL.ConfigURL para ativar o uso do SSL para proteger o pedido de token SAML com o STS.

      Sim
      SamlConstants.SAML_APPLIES_TO Especifica o endereço do STST de destino para onde deseja usar o token SAML. Não
      SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST Especifica se pedir do STS um token único que esteja integrado em um elemento RequestSecurityToken (RST) ou diversos tokens em uma coleção de elementos RST que estão integrados em um único elemento RequestSecurityTokenCollection (RSTC).

      O comportamento padrão é pedir um único token que esteja integrado em um elemento RequestSecurityToken (RST) do STS.

      Especificar um valor true para essas propriedade indica pedir diversos tokens em uma coleção de elementos RST que estão integrados em um único elemento RequestSecurityTokenCollection (RSTC) do STS.

      Não
      SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE Especifica o namespace WS-Trust que é incluído no pedido WS-Trust.

      O valor padrão é WSTrust 1.3.

      Não

      Uma instância WSSGenerationContext e uma instância WSSConsumingContext também são configuradas no objeto SAMLGenerateCallbackHandler. A instância WSSGenerationContext deve conter um objeto UNTGenerateCallbackHandler com as informações para criar o UsernameToken que você deseja enviar para o STS.

      O parâmetro system.wss.generate.saml especifica o módulo de login de Java Authentication and Authorization Service (JAAS) que é usado para criar o token SAML. Você deve especificar uma propriedade JVM para definir um arquivo de configuração JAAS que contém a configuração de login do JAAS necessária; por exemplo:
      -Djava.security.auth.login.config=profile_root/properties/wsjaas_client.conf 
      Alternativamente, é possível especificar um arquivo de configuração de login do JAAS definindo uma propriedade do sistema Java no código do cliente de amostra; por exemplo:
      System.setProperty("java.security.auth.login.config", "profile_root/properties/wsjaas_client.conf");
    2. Obtenha o identificador de token do token SAML criado.
      Use a seguinte instrução como um teste simples para o token SAML que você criou:
      System.out.println("SAMLToken id = " + samlToken.getId())
  5. Inclua o token SAML no cabeçalho de segurança SOAP de uma mensagem de pedido de serviços.
    1. Inicialize o cliente dos serviços da Web e configure as propriedades SOAPAction. O seguinte exemplo de código ilustra essas ações:
      // Inicializar o cliente de serviços da Web
      EchoService12PortProxy echo = new EchoService12PortProxy();
      echo._getDescriptor().setEndpoint(endpointURL);
      
      // Configurar propriedades SOAPAction
      BindingProvider bp = (BindingProvider) (echo._getDescriptor().getProxy());
      Map<String, Object> requestContext = bp.getRequestContext();
      requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
      requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY,	Boolean.TRUE);
      requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation");
      			
      // Inicializar WSSGenerationContext
      WSSGenerationContext gencont = factory.newWSSGenerationContext();
      gencont.add(samlToken);	
    2. Inicializar o WSSGenerationContext. O seguinte fragmento de código ilustra o uso do gencont.object do tipo WSSGenerationContext para inicializar um contexto de geração para possibilitar que você insira o SAMLToken em uma mensagem de pedido de serviços da Web:
      // Inicializar WSSGenerationContext
      WSSGenerationContext gencont = factory.newWSSGenerationContext();
      gencont.add(samlToken);	
      Especificamente, a chamada de método gencont.add(samlToken) especifica colocar o token SAML em uma mensagem de pedido. Essa operação requer que o código do cliente tenha a seguinte permissão de Segurança Java 2:
       permission javax.security.auth.AuthPermission "modifyPrivateCredentials"
  6. Inclua um token X.509 para a proteção de mensagens usando a Web Services Security API.
    Esse código de exemplo usa o arquivo-chave dsig-sender.ks e a chave de amostra SOAPRequester. Você não deve usar a chave de amostra em um ambiente de produção. O fragmento de código a seguir ilustra a inclusão de um token X.509 para proteção de mensagens:
    // Incluir um Token X.509 para proteção de mensagens
        X509GenerateCallbackHandler x509callbackHandler = new X509GenerateCallbackHandler(
            	null,
            	"profile_root/etc/ws-security/samples/dsig-sender.ks", 
            	"JKS", 
            	"client".toCharArray(), 
            	"soaprequester", 
            	"client".toCharArray(), 
            	"CN=SOAPRequester, OU=TRL, O=IBM, ST=Kanagawa, C=JP", null);	
    
       SecurityToken x509 = factory.newSecurityToken(X509Token.class,
       x509callbackHandler, "system.wss.generate.x509");
    
       WSSSignature sig = factory.newWSSSignature(x509);
       sig.setSignatureMethod(WSSSignature.RSA_SHA1);
                    	
       WSSSignPart sigPart = factory.newWSSSignPart();
       sigPart.setSignPart(samlToken);
       sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
       sig.addSignPart(sigPart);                	
       sig.addSignPart(WSSSignature.BODY);
    1. Crie um objeto WSSSignature com o token X509. A seguinte linha de código cria um objeto WSSSignature com o token X509:
      WSSSignature sig = factory.newWSSSignature(x509);
    2. Inclua a parte assinada para usar para proteção de mensagem. A seguinte linha de código especifica para incluir WSSSignature.BODY como a parte assinada:
      sig.addSignPart(WSSSignature.BODY);
    3. Inclua o elemento de registro de data e hora no cabeçalho de segurança das mensagens SOAP. O conjunto de políticas padrão SAML20 SenderVouches WSHTTPS requer pedidos de serviços da Web e mensagens de resposta para transportar um elemento de registro de data e hora no cabeçalho de Segurança das mensagens SOAP. No seguinte fragmento de código, a chamada do método factory.newWSSTimestamp() gera o registro de data e hora, e a chamada de método gencont.add(timestamp) inclui o registro de data e hora em uma mensagem de pedido:
      // Incluir registro de data e hora
      WSSTimestamp timestamp = factory.newWSSTimestamp();
         gencont.add(timestamp);
      sig.addSignPart(WSSSignature.TIMESTAMP);
                  
      gencont.add(sig);
              	
      			
      WSSConsumingContext concont = factory.newWSSConsumingContext();
    4. Configure a assinatura do token SAML usando o algoritmo de transformação STR-Transform.
      Um WSSSignPart separado é necessário para especificar o algoritmo de transformação SecurityTokenReference que é representado pelo atributo WSSSignPart.TRANSFORM_STRT10. Um Token SAML não pode ser assinado digitalmente diretamente. Esse atributo ativa o ambiente de tempo de execução da Segurança de Serviços da Web para gerar um elemento SecurityTokenReference para referenciar o SAMLToken e assinar digitalmente o SAMLToken usando a transformação 7SecurityTokenReference. A seguinte linha de código especifica para usar o atributo WSSSignPart.TRANSFORM_STRT10:
      WSSSignPart sigPart = factory.newWSSSignPart();
      sigPart.setSignPart(samlToken);
      sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
    5. Conecte o objeto WSSGenerationContext ao objeto RequestContext dos serviços da Web. O objeto WSSGenerationContext agora contém as informações de segurança que são necessárias para formatar uma mensagem de pedido. A chamada de método gencont.process(requestContext) conecta o objeto WSSGenerationContext ao objeto RequestContext dos serviços da Web para possibilitar ao ambiente de tempo de execução da Segurança de Serviços da Web formatar o cabeçalho de segurança SOAP necessário; por exemplo:
      // Conecta o objeto WSSGenerationContext ao objeto RequestContext dos serviços da Web. 
      gencont.process(requestContext);
  7. Use o token X.509 para validar a assinatura digital e a integridade da mensagem de resposta. Se a política do provedor requerer que a mensagem de resposta seja digitalmente assinada, você deve inicializar o token X.509.
    1. Um objeto X509ConsumeCallbackHandler é inicializando com um truststore, dsig-receiver.ks e um objeto de caminho do certificado para validar a assinatura digital do provedor. A linha de código a seguir é usada para inicializar o objeto X509ConsumeCallbackHandler:
      X509ConsumeCallbackHandler callbackHandlerVer = new X509ConsumeCallbackHandler( 
       "profile_root/etc/ws-security/samples/dsig-receiver.ks",
                "JKS",
                 "server".toCharArray(),
                  certList,
                        java.security.Security.getProvider("IBMCertPath"));
    2. Um objeto WSSVerification é criado e o corpo da mensagem é incluído ao objeto de verificação para que o ambiente de tempo de execução da Segurança de Serviços da Web valide a assinatura digital.
      A linha de código a seguir é usada para inicializar o objeto WSSVerification:
      WSSVerification ver = factory.newWSSVerification(X509Token.class, callbackHandlerVer);
      O objeto WSSConsumingContext agora contém as informações de segurança que são necessárias para formatar uma mensagem de pedido. A chamada de métodoconcont.process(requestContext) conecta o objeto WSSConsumingContext ao método de reposta; por exemplo:
      // Conecta o objeto WSSConsumingContext ao objeto RequestContext dos serviços da Web. 
      concont.process(requestContext);

Resultados

Você solicitou um token SAML com o método de confirmação sender-vouches a partir de um STS externo. Após obter o token, você enviou o token com mensagens de solicitação de serviço da web usando a proteção no nível da mensagem usando o modelo de programação JAX-WS e as WSS APIs.

Exemplo

A amostra de código a seguir é um aplicativo cliente de serviço da web completo, pronto para uso, que demonstra como solicitar um token SAML a partir de um STS externo e enviar esse token SAML em mensagens de solicitação de serviços da web com a proteção no nível da mensagem. Este código de amostra ilustra as etapas de procedimento descritas anteriormente.

/**
 * The following source code is sample code created by IBM Corporation.  
 * This sample code is provided to you solely for the purpose of assisting you in the  
 * da tecnologia.  The code is provided 'AS IS', without warranty or condition of 
 * nenhum tipo.  IBM shall not be liable for any damages arising out of your use of the 
 * código de amostra, mesmo se a IBM tiver sido avisada da possibilidade de tais danos.
 */
package com.ibm.was.wssample.sei.cli;

import com.ibm.was.wssample.sei.echo.EchoService12PortProxy;
import com.ibm.was.wssample.sei.echo.EchoStringInput;
import com.ibm.websphere.wssecurity.callbackhandler.SAMLGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.callbackhandler.UNTGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
import com.ibm.websphere.wssecurity.wssapi.WSSConsumingContext;
import com.ibm.websphere.wssecurity.wssapi.WSSFactory;
import com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext;
import com.ibm.websphere.wssecurity.wssapi.WSSTimestamp;
import com.ibm.websphere.wssecurity.wssapi.token.SAMLToken;
import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
import com.ibm.websphere.wssecurity.callbackhandler.X509ConsumeCallbackHandler;
import com.ibm.websphere.wssecurity.callbackhandler.X509GenerateCallbackHandler;
import com.ibm.websphere.wssecurity.wssapi.WSSException;
import com.ibm.websphere.wssecurity.wssapi.signature.WSSSignPart;
import com.ibm.websphere.wssecurity.wssapi.signature.WSSSignature;
import com.ibm.websphere.wssecurity.wssapi.verification.WSSVerification;
import com.ibm.websphere.wssecurity.wssapi.token.X509Token;
import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants;
import com.ibm.wsspi.wssecurity.saml.config.SamlConstants;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.cert.CertStore;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.CollectionCertStoreParameters;
import java.security.cert.X509Certificate;
import java.util.HashSet;
import java.util.Set;
import java.util.HashMap;
import java.util.Map;

import javax.xml.ws.BindingProvider;

public class SampleSamlSVClient {
	private String urlHost = "localhost";
	private String urlPort = "9080";
	private static final String CONTEXT_BASE = "/WSSampleSei/";
	private static final String ECHO_CONTEXT12 = CONTEXT_BASE+"EchoService12";	
	private String message = "HELLO";
	private String uriString = "http://" + urlHost + ":" + urlPort;
	private String endpointURL = uriString + ECHO_CONTEXT12;
	private String input = message;

	/**
	 * main()
	 * 
	 * consulte printusage() para argumentos de linha de comandos
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		SampleSamlSVClient sample = new SampleSamlSVClient();
		sample.CallService();
	}

	/**
	 * Os CallService Parms já foram lidos. Agora chame as classes proxy do serviço. 
	 * 
	 */
	anular CallService() {
		Resposta de sequência = "ERROR!:";
		try {
			    System.setProperty("com.ibm.SSL.ConfigURL", "profile_root/properties/ssl.client.props");
			    System.setProperty("java.security.auth.login.config", "profile_root/properties/wsjaas.conf");
			

//Pedir o SAML Token a partir de STS externo
WSSFactory factory = WSSFactory.getInstance();
sequência STS_URI  = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
Sequência ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
WSSConsumingContext concont1 = factory.newWSSConsumingContext(); 
HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
cbackMap1.put(SamlConstants.STS_ADDRESS, STS_URI);
cbackMap1.put(SamlConstants.SAML_APPLIES_TO, ENDPOINT_URL);
cbackMap1.put(SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
cbackMap1.put(SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
cbackMap1.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML11_VALUE_TYPE);
cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");

SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);

// Incluir UNT ao pedido de confiança
UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);

gencont1.add(ut);

cbHandler1.setWSSConsumingContextForTrustClient(concont1);
cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, cbHandler1, "system.wss.generate.saml");

System.out.println("SAMLToken id = " + samlToken.getId());                        
			
	        // Initialize web services client. 
			EchoService12PortProxy echo = new EchoService12PortProxy();
			echo._getDescriptor().setEndpoint(endpointURL);

			// Configurar propriedades SOAPAction 
			BindingProvider bp = (BindingProvider) (echo._getDescriptor().getProxy());
			Map<String, Object> requestContext = bp.getRequestContext();
			requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
			requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY,	Boolean.TRUE);
			requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation");
			
			// Inicializar WSSGenerationContext
			WSSGenerationContext gencont = factory.newWSSGenerationContext();
	        gencont.add(samlToken);		        
	        
	        // Incluir Tokens X.509 para proteção de mensagem
            X509GenerateCallbackHandler x509callbackHandler = new X509GenerateCallbackHandler(
        			null,
        			"profile_root/etc/ws-security/samples/dsig-sender.ks", 
        			"JKS", 
        			"client".toCharArray(), 
        			"soaprequester", 
        			"client".toCharArray(), 
        			"CN=SOAPRequester, OU=TRL, O=IBM, ST=Kanagawa, C=JP", null);	

            SecurityToken x509 = factory.newSecurityToken(X509Token.class,
            x509callbackHandler, "system.wss.generate.x509");

            WSSSignature sig = factory.newWSSSignature(x509);
            sig.setSignatureMethod(WSSSignature.RSA_SHA1);
                	
            WSSSignPart sigPart = factory.newWSSSignPart();
            sigPart.setSignPart(samlToken);
            sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
            sig.addSignPart(sigPart);                	
            sig.addSignPart(WSSSignature.BODY);
            
	        // Incluir registro de data e hora
	        WSSTimestamp timestamp = factory.newWSSTimestamp();
			gencont.add(timestamp);
        	sig.addSignPart(WSSSignature.TIMESTAMP);
            
        	gencont.add(sig);
        	
			
        	WSSConsumingContext concont = factory.newWSSConsumingContext();
        	
        	// Preparar para consumir registro de data e hora em mensagem de resposta
	     	concont.add(WSSConsumingContext.TIMESTAMP); 
	        
	     	// Preparar para verificar a assinatura digital em mensagem de resposta        	
	        X509Certificate x509cert = null;
	        try {
	                InputStream is = new FileInputStream("profile_root/etc/ws-security/samples/intca2.cer");
	                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);

	        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);
	        }

	        X509ConsumeCallbackHandler callbackHandlerVer = new X509ConsumeCallbackHandler(
	        		"profile_root/etc/ws-security/samples/dsig-receiver.ks",
	        		"JKS",
	        		"server".toCharArray(),
	        		certList,
	        		java.security.Security.getProvider("IBMCertPath"));

	        WSSVerification ver = factory.newWSSVerification(X509Token.class, callbackHandlerVer);

	        ver.addRequiredVerifyPart(WSSVerification.BODY);
	        concont.add(ver);
						
	        gencont.process(requestContext);
	        concont.process(requestContext);
	        
	        // Construir o objeto de entrada
			EchoStringInput echoParm = 
				new com.ibm.was.wssample.sei.echo.ObjectFactory().createEchoStringInput();
			echoParm.setEchoInput(input);
			System.out.println(">> CLIENT: SEI Echo to " + endpointURL);		
						
			// Chamar o serviço
			response = echo.echoOperation(echoParm).getEchoResponse();
						
			System.out.println(">> CLIENT: SEI Echo invocation complete.");
			System.out.println(">> CLIENT: SEI Echo response is: " + response);
		} catch (Exception e) {
			System.out.println(">> CLIENT: ERROR: SEI Echo EXCEPTION.");
			e.printStackTrace();
		}
	}
}
Quando essa amostra de aplicativo de cliente de serviços da Web executa corretamente, você recebe mensagens como as seguintes:
SAMLToken id = _6CDDF0DBF91C044D211271166233407
Recuperando documento em'file:profile_root/.../wsdl/'.
>> CLIENT: SEI Echo to http://localhost:9443/WSSampleSei/EchoService12
>> CLIENT: SEI Echo invocation complete.
>> CLIENT: SEI Echo response is: SOAP12==>>HELLO

Í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_configsamlsendervouches_msglevel_requeststs
Nome do arquivo: twbs_configsamlsendervouches_msglevel_requeststs.html