Enviando Tokens sender-vouches SAML Autoemitidos Usando APIs do WSS com Proteção do Transporte SSL

É possível criar tokens SAML autoemitidos com o método de confirmação de assunto sender-vouches e, em seguida, usar o modelo de programação Java™ API for XML-Based Web Services (JAX-WS) e APIs Web Services Security (APIs WSS) para enviar estes tokens com mensagens de solicitação de serviços da web com proteção de transporte.

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, a proteção de transporte SSL 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 construir o seu cliente de serviços da Web para usar tokens SAML com o método de confirmação de assunto de sender-vouches em mensagens de pedido SOAP usando as interfaces de programação de Segurança de Serviços da Web. Usar as interfaces de programação em um cliente de serviços da Web para especificar o uso de tokens SAML com confirmação de assunto de sender-vouches usando proteção de mensagem no nível de transporte é uma abordagem alternativa para o uso de conjuntos de política e configurações de ligação.

É possível criar um token SAML autoemitido e, em seguida, enviar o token SAML em mensagens de solicitação de serviços da web a partir de um cliente de serviços da web. 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 na seção Exemplo.

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 usar a API Web Services Security para passar tokens sender-vouches SAML em mensagens de solicitação 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 client de serviços da Web JAX-WS; porém, também é possível usar um cliente gerenciado.

  2. Crie uma cópia do conjunto de políticas padrão SAML20 Bearer WSHTTPS ou do conjunto de políticas padrão SAML11 Bearer WSHTTPS.

    Forneça um nome para a cópia do conjunto de políticas; por exemplo, SAML20 SenderVouches WSHTTPS ou SAML11 SenderVouches WSHTTPS para ajudá-lo a identificar se esse novo conjunto de políticas usa o método de confirmação de sender-vouches.

    Nenhuma mudança adicional é necessária para o novo arquivo de políticas porque o método de confirmação de assunto é especificado na configuração da ligação e não na política.

    O novo arquivo de políticas contém SAMLToken20Bearer ou SAMLToken11Bearer como os identificadores de política. Mude o identificador da política SAMLToken20Bearer para SAMLToken20SV ou mude o identificador da política SAMLToken11Bearer para SAMLToken11SV para especificar um nome mais descritivo. Mudar o identificador da política não muda o cumprimento da política de forma alguma; porém, incluir um identificador descritivo o ajuda a identificar se esses identificadores de política usam o método de confirmação de sender-vouches.

    Se desejar visualizar as configurações dessas políticas, use o console administrativo para concluir as seguintes ações:
    1. Clique em Serviços > Conjuntos de Política > Conjuntos de Política de Aplicativo > policy_set_name.
    2. Clique na política WS-Security na tabela de políticas.
    3. Clique no link Política Principal ou no link Política de Auto-inicialização.
    4. Clique em Pedir políticas de token na seção Detalhes da Política.
  3. Conecte o novo conjunto de políticas SAML20 SenderVouches WSHTTPS ou ao SAML11 SenderVouches WSHTTPSprovedor ao aplicativo do provedor de serviços da Web. Consulte sobre a configuração de ligações de cliente e provedor para o token sender-vouches para obter detalhes sobre como conectar esse conjunto de políticas ao seu aplicativo do provedor de serviços da Web.
  4. Crie uma cópia das ligações gerais padrão de amostra SAML Bearer Provider.
    1. Para a nova cópia do conjunto de políticas padrão, forneça um nome que inclua sender-vouches, como ligação do provedor SAML Sender-vouches.
    2. Mude o valor da propriedade confirmationMethod para sender-vouches na configuração do consumidor de token para a versão de token SAML desejada. Consulte sobre a configuração de ligações de cliente e provedor para o token sender-vouches SAML para obter detalhes sobre como modificar as ligações sender-vouches para satisfazer o requisito de vouching.
  5. Designe a nova ligação do provedor para a amostra do provedor JaxWSServicesSamples. Consulte sobre a configuração de ligações de cliente e provedor para o sender-vouches SAML para obter detalhes sobre como designar a amostra do provedor sender-vouches SAML, as ligações gerais padrão para o seu aplicativo do provedor de serviços da web.
  6. Ative o atributo de configuração SSL do provedor de serviços, clientAuthentication, para requerer autenticação por certificado de cliente X.509.
    O atributo clientAuthentication determina se a autenticação de cliente SSL é requerida. Para especificar o atributo clientAuthentication, use o console administrativo para concluir as seguintes ações:
    1. Clique em Segurança > Certificados SSL e gerenciamento de chave > Gerenciar configurações de segurança de terminal > {Entrada| Saída} > SSL_configuration.
    2. Clique no link WC_defaulthost_secure.
    3. Em Itens Relacionados, clique no linkSSL_configurations.
    4. Selecione o recurso NodeDefaultSSLSettings.
    5. Clique no link Configurações de Qualidade de proteção (QoP).
    6. Selecione Necessário no menu para especificar autenticação de cliente.

    Consulte sobre a criação de uma configuração de camada de soquetes seguros para saber mais sobre a configuração do atributo clientAuthentication.

  7. No código do cliente de serviços da Web, use o método CallService() para especificar o arquivo de propriedades que contém parâmetros de configuração necessários para gerar um token SAML autoemitido.

    O método CallService() define os parâmetros de configuração que são necessários pelo ambiente de tempo de execução Web Services Security para gerar um SAMLToken emitido automaticamente.

    O seguinte fragmento de código ilustra o uso do método CallService() para especificar os parâmetros de configuração de segurança dos serviços da Web:
    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("java.security.auth.login.config", "profile_root/properties/wsjaas_client.conf ");
        // Initialize WSSFactory object 
        WSSFactory factory = WSSFactory.getInstance();
    
        // Inicializar WSSGenerationContext
        WSSGenerationContext gencont = factory.newWSSGenerationContext();
        // Initialize SAML issuer configuration via custom properties
        HashMap <Object, Object> customProps = new HashMap<Object,Object>();
    
        customProps.put(SamlConstants.ISSUER_URI_PROP, "example.com");
        customProps.put(SamlConstants.TTL_PROP, "3600000");
        customProps.put(SamlConstants.KS_PATH_PROP, "keystores/saml-provider.jceks");
        customProps.put(SamlConstants.KS_TYPE_PROP, "JCEKS");
        customProps.put(SamlConstants.KS_PW_PROP, "{xor}LCswLTovPiws");
        customProps.put(SamlConstants.KEY_ALIAS_PROP, "samlissuer");
        customProps.put(SamlConstants.KEY_NAME_PROP, "CN=SAMLIssuer, O=EXAMPLE");
        customProps.put(SamlConstants.KEY_PW_PROP, "{xor}NDomLz4sLA==");
        customProps.put(SamlConstants.TS_PATH_PROP, "keystores/saml-provider.jceks");
        customProps.put(SamlConstants.TS_TYPE_PROP, "JCEKS");
        customProps.put(SamlConstants.TS_PW_PROP, "{xor}LCswLTovPiws");  
        gencont.add(customProps); //Add custom properties

    Consulte sobre a configuração de um token SAML durante a criação do token para obter informações adicionais sobre como é possível especificar propriedades de configuração para controlar como o token é configurado.

  8. 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 de 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.
  9. Crie o token SAML autoemitido. O seguinte fragmento de código ilustra a criação do token sender-vouches SAML:
    // Criar SAMLToken
    HashMap<Object, Object> map = new HashMap<Object, Object>();
    map.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");
    map.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML20_VALUE_TYPE);
    map.put(SamlConstants.SAML_NAME_IDENTIFIER, "Alice");
    map.put(SamlConstants.SIGNATURE_REQUIRED, "true");			
    SAMLGenerateCallbackHandler callbackHandler = new SAMLGenerateCallbackHandler(map);	
    SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml");
    System.out.println("SAMLToken id = " + samlToken.getId());
    1. Use o método WSSFactory newSecurityToken para especificar como criar o token SAML.
      Especifique o seguinte método para criar o token SAML:
      WSSFactory  newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml")
      Criar 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á criando. Esse objeto aponta para um objeto SAMLGenerateCallbackHandler que 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 Obrigatório
      SamlConstants.CONFIRMATION_METHOD Especifica para usar o método de confirmação sender-vouches. Sim
      SamlConstants.TOKEN_TYPE

      Usa o valor constante, WSSConstants.SAML.SAML20_VALUE_TYPE, para especificar um tipo de token SAML 2.0.

      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. Nesse cenário, especifique o tipo de valor de token pelo atributo valueType da configuração de ligação tokenGenerator.

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

      Sim
      SamlConstants.SAML_NAME_IDENTIFIER

      Especifica uma identidade de usuário como myname como o valor NameID no SAMLToken.

      Se você não definir esse parâmetro ao usar o Thin Client for JAX-WS, o valor NameID não conterá informações úteis.

      Se estiver usando um cliente gerenciado de serviços da Web, como um aplicativoJava Platform, Enterprise Edition (Java EE) fazendo um chamado de pedido de serviços da Web, o ambiente de tempo de execução da Segurança de Serviços da Web tenta extrair informações sobre a segurança do usuário do contexto de segurança. Da mesma forma, se você não definir esse parâmetro para um cliente de serviços da Web gerenciado, o valor NameID conterá um identificador de nome UNAUTHENTICATED.

      Essa propriedade não é usada se o seu cliente de serviços da Web possui conexões do conjunto de políticas. Leia sobre como enviar tokens SAML para saber mais sobre como enviar a identidade e os atributos do token SAML.

      Não
      SamlConstants.SIGNATURE_REQUIRED

      Especifica se o emissor deve assinar digitalmente o token SAML.

      Um valor true especifica que o emissor deve assinar digitalmente o token SAML. Esse valor é o padrão.

      Não
      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 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())

Resultados

Você criou um token SAML autoemitido com o método de confirmação sender-vouches com proteção de transporte e, em seguida, enviar este token com mensagens de solicitação de serviços da web usando o modelo de programação JAX-WS e as APIs do WSS.

Exemplo

A amostra de código a seguir é um aplicativo cliente de serviços da web completo, pronto para uso que demonstra como criar um token sender-vouches SAML autoemitido e enviar esse token SAML em mensagens de solicitação de serviços da web. Esse código de amostra ilustra as etapas do procedimento descritas previamente.

/**
 * O seguinte código de origem é um código de amostra criado pela IBM Corporation.  
 * Esse código de amostra é fornecido a você apenas para o propósito de ajudá-lo no uso  
 * da tecnologia.  O código é fornecido 'NO ESTADO EM QUE SE ENCONTRA', sem garantia ou condição de 
 * nenhum tipo.  A IBM não será responsável por nenhum dano oriundo do uso do 
 * 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.wssapi.WSSFactory;
import com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext;
import com.ibm.websphere.wssecurity.wssapi.WSSConsumingContext;
import com.ibm.websphere.wssecurity.wssapi.WSSTimestamp;
import com.ibm.websphere.wssecurity.callbackhandler.SAMLGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.wssapi.token.SAMLToken;
import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants;
import com.ibm.wsspi.wssecurity.saml.config.SamlConstants;

import java.util.Map;
import java.util.HashMap;

import javax.xml.ws.BindingProvider;

public class SampleSamlSVClient {
  private String urlHost = "localhost";
  private String urlPort = "9081";
  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("java.security.auth.login.config", "profile_root/properties/wsjaas_client.conf ");

      // Initialize WSSFactory object
      WSSFactory factory = WSSFactory.getInstance();
      // Inicializar WSSGenerationContext
      WSSGenerationContext gencont = factory.newWSSGenerationContext();
      // Initialize SAML issuer configuration via custom properties
	    HashMap<Object, Object> customProps = new HashMap<Object,Object>();

      customProps.put(SamlConstants.ISSUER_URI_PROP, "example.com");
      customProps.put(SamlConstants.TTL_PROP, "3600000");
      customProps.put(SamlConstants.KS_PATH_PROP, "keystores/saml-provider.jceks");
      customProps.put(SamlConstants.KS_TYPE_PROP, "JCEKS");
      customProps.put(SamlConstants.KS_PW_PROP, "{xor}LCswLTovPiws");
      customProps.put(SamlConstants.KEY_ALIAS_PROP, "samlissuer");
      customProps.put(SamlConstants.KEY_NAME_PROP, "CN=SAMLIssuer, O=EXAMPLE");
      customProps.put(SamlConstants.KEY_PW_PROP, "{xor}NDomLz4sLA==");
      customProps.put(SamlConstants.TS_PATH_PROP, "keystores/saml-provider.jceks");
      customProps.put(SamlConstants.TS_TYPE_PROP, "JCEKS");
      customProps.put(SamlConstants.TS_PW_PROP, "{xor}LCswLTovPiws");  
      gencont.add(customProps); //Add custom properties

      // Criar SAMLToken
      HashMap<Object, Object> map = new HashMap<Object, Object>();
      map.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");
      map.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML20_VALUE_TYPE);
      map.put(SamlConstants.SAML_NAME_IDENTIFIER, "Alice");
      map.put(SamlConstants.SIGNATURE_REQUIRED, "true");			
      SAMLGenerateCallbackHandler callbackHandler = new SAMLGenerateCallbackHandler(map);
      SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml");

      System.out.println("SAMLToken id = " + samlToken.getId());

      // 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");

      gencont.add(samlToken);

      // Incluir registro de data e hora
      WSSTimestamp timestamp = factory.newWSSTimestamp();
      gencont.add(timestamp);

      gencont.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);

      // Preparar para consumir registro de data e hora em mensagem de resposta
      WSSConsumingContext concont = factory.newWSSConsumingContext();
      concont.add(WSSConsumingContext.TIMESTAMP);
      concont.process(requestContext);

      // 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_transportlevel_usingwssapi
Nome do arquivo: twbs_configsamlsendervouches_transportlevel_usingwssapi.html