Criando um Token holder-of-key SAML Utilizando a API

O token holder-of-key SAML estende a interface pública do token de segurança no WebSphere Application Server e pode ser utilizado como um token de proteção. O WebSphere Application Server fornece uma API de biblioteca de SAML para criação de token SAML holder-of-key.

Sobre Esta Tarefa

A criação do token SAML requer três parâmetros:
  • com.ibm.wsspi.wssecurity.saml.config.RequesterConfig
  • com.ibm.wsspi.wssecurity.saml.config.ProviderConfig
  • com.ibm.wsspi.wssecurity.saml.config.CredentialConfig
Siga as etapas para criar uma instância para cada um dos parâmetros e depois criar um token holder-of-key SAML. Como uma alternativa para CredentialConfig, também é possível usar javax.security.auth.Subject. Para obter informações adicionais, leia a documentação da API.

Procedimento

  1. Crie uma instância com.ibm.websphere.wssecurity.wssapi.token.SAMLTokenFactory utilizando a versão do token SAML como um parâmetro. As versões de token SAML suportadas são http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1 e http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0. A instância SAMLTokenFactory é um singleton e, portanto, é thread-safe. Utilize uma das seguintes linhas de código para criar a instância, dependendo da versão do token.
    • Utilize a seguinte linha de código para criar uma instância com.ibm.websphere.wssecurity.wssapi.token.SAMLTokenFactory para um token SAML versão 1.1:
      SAMLTokenFactory samlFactory = SAMLTokenFactory.getInstance(SAMLTokenFactory.WssSamlV11Token11);
    • Utilize a seguinte linha de código para criar uma instância com.ibm.websphere.wssecurity.wssapi.token.SAMLTokenFactory para um token SAML versão 2.0:
      SAMLTokenFactory samlFactory = SAMLTokenFactory.getInstance(SAMLTokenFactory.WssSamlV11Token20);
  2. A instância SAMLTokenFactory será utilizada para criar uma instância RequesterConfig, que determina como o token é gerado, de acordo com os requisitos de autenticação do solicitante. Utilize uma destas linhas de código para criar a instância RequesterConfig, dependendo se você quer que o token utilize uma chave secreta (chave simétrica) ou uma chave pública:
    • Utilize a seguinte linha de código para criar um RequesterConfig padrão para o token holder-of-key SAML utilizando uma chave secreta (chave simétrica), que está incluída em SubjectConfirmation:
      RequesterConfig reqData = samlFactory. newSymmetricHolderOfKeyTokenGenerateConfig ();
      Também é necessário configurar o alias de chave para o serviço de destino para que o provedor possa criptografar a chave secreta para o serviço:
      reqData.setKeyAliasForAppliesTo("SoapRecipient");
    • Utilize a seguinte linha de código para criar um RequesterConfig padrão para o token holder-of-key SAML utilizando uma chave pública, que está incluída em SubjectConfirmation:
      RequesterConfig reqData = samlFactory. newAsymmetricHolderOfKeyTokenGenerateConfig ();
      Também é necessário configurar o alias de chave para o solicitante para que o provedor possa extrair a chave pública do solicitante e incluí-la em SubjectConfirmation:
      reqData.setKeyAliasForRequester(“SOAP Initiator”);
    A instância RequestConfig padrão é suficiente para gerar um token holder-of-key simples, mas asserções adicionais podem ser incluídas no token SAML por meio da customização da instância RequesterConfig. Por exemplo, para incluir informações de autenticação de senha no token, utilize setAuthenticationMethod:
    reqData.setAuthenticationMethod(“password”);
  3. Utilize SAMLTokenFactory para criar uma instância ProviderConfig, que descreve o emissor do token. A instância ProviderConfig especifica o nome do emissor SAML, bem como informações do keystore e do truststore, que identificam a chave para assinatura e criptografia SAML. A instância ProviderConfig é criada por meio do uso de valores de propriedade de um arquivo de propriedades. O arquivo de propriedades especifica o valor padrão do objeto ProviderConfig. Em um ambiente de cliente Java™, esse arquivo de propriedades é definido por uma propriedade de sistema JVM, com.ibm.webservices.wssecurity.platform.SAMLIssuerConfigDataPath.
    No ambiente de tempo de execução WebSphere Application Server, o nome do arquivo de propriedades é SAMLIssuerConfig.properties. O arquivo pode estar localizado no diretório de configuração no nível do servidor ou no diretório no nível da célula, nessa ordem de precedência. Um exemplo de caminho no nível do servidor é o seguinte:
    app_server_root/profiles/$PROFILE/config/cells/$CELLNAME/nodes/$NODENAME/servers/$SERVERNAME/SAMLIssuerConfig.properties
    Um exemplo de caminho no nível da célula é o seguinte:
    app_server_root/profiles/$PROFILE/config/cells/$CELLNAME/sts/SAMLIssuerConfig.properties

    A propriedade de sistema JVM, com.ibm.webservices.wssecurity.platform.SAMLIssuerConfigDataPath, será ignorada se a propriedade for definida no ambiente de tempo de execução do servidor. Para obter uma descrição detalhada de todas as propriedades, leia sobre a configuração de um token SAML durante a criação do token.

    Utilize a seguinte linha de código para criar uma instância ProviderConfig padrão:

    ProviderConfig samlIssuerCfg = samlFactory.newDefaultProviderConfig(“any issuer name”);
    O nome do emissor é opcional. Se o nome do emissor for especificado, ele aparecerá na asserção do SAML. Se o nome do emissor não for especificado, uma propriedade de nome do emissor padrão de SAMLIssuerConfig.properties será utilizada como nome do emissor.
  4. Opcional: Durante a criação de um novo token SAML, SAMLTokenFactory utiliza um JAAS subject ou uma instância CredentialConfig para preencher o novo token SAML. Para usar um JAAS subject para preencher o token, utilize a API getCallerSubject() ou a API getRunAsSubject() do com.ibm.websphere.security.auth.WSSubject para obter um JAAS subject que represente o cliente solicitante ou a identidade do encadeamento de execução.

    Quando você utiliza o JAAS subject para criar um novo token SAML, SAMLTokenFactory procura um objeto SAMLToken na lista PrivateCredentials do subject. Se um objeto SAMLToken existir, NameId ou NameIdentifier será copiado no novo token SAML. O SAMLTokenFactory também copia os atributos SAML e AuthenticationMethod do token SAML existente no novo token SAML. O novo token SAML inclui um novo nome de emissor, novo certificado de assinatura, método de confirmação, novo KeyInfo para o método de confirmação holder-of-key e novas condições NotBefore e NotOnAfter. Essas configurações de token são determinadas pelos parâmetros de configuração nos objetos ProviderConfig e RequesterConfig.

    Se não houver um objeto SAMLToken no assunto, apenas o nome do principal WSPrincipal será copiado do assunto no novo token SAML. Nenhum outro atributo no subject será criado no novo token SAML. Da mesma forma, o nome do emissor, o certificado de assinatura, o método de confirmação, KeyInfo para holder-of-key e as condições NotBefore e NotOnOrAfter são determinados pelos parâmetros de configuração nos objetos ProviderConfig e RequesterConfig.

    Alternativamente, é possível usar o método RunAsSubject no encadeamento de execução para criar o token SAML. Ao usar esse método, não transmita o JAAS subject ou o objeto CredentialConfig ao SAMLTokenFactory para criar o token SAML. Em vez disso, o conteúdo do token SAML existente será copiado no novo token SAML, conforme descrito anteriormente.

    Outro método de criação de um token SAML é o uso do objeto CredentialConfig para preencher o NameId e Atributos SAML programaticamente. Utilize esse método nas seguintes circunstâncias:
    • Atributos SAML customizados devem ser incluídos no novo token SAML.
    • O token SAML é criado manualmente em vez de se usar SAMLTokenFactory para preencher o token SAML automaticamente a partir de um JAAS subject.
    • Não existe um token SAML existente no subject.
    • Não existe um JAAS subject disponível.

    Para criar um objeto CredentialConfig sem o uso do JAAS subject, utilize esta linha de código:

    CredentialConfig cred = samlFactory.newCredentialConfig ();
    Não existe um valor inicial fornecido para esse objeto CredentialConfig, portanto, é necessário usar métodos setter para preencher o objeto CredentialConfig.
    Para preencher o NameIdentifier ou NameID SAML, utilize a seguinte linha de código:
    cred.setRequesterNameID("any name");
    O valor da variável any name é utilizado como nome do principal no token SAML. O nome aparece na asserção como NameIdentifier em um token SAML Versão 1.1, ou NameId no token SAML Versão 2.0. Por exemplo, se o valor de any name for Alice, a asserção a seguir será gerada em um token SAML Versão 1.1:
    <saml:NameIdentifier>Alice</saml:NameIdentifier>
    A asserção a seguir é gerada em um token SAML Versão 2.0:
    <saml2:NameID>Alice</saml2:NameID> 

    Para incluir atributos SAML na parte <AttributeStatement> de uma asserção, use este código:

    SAMLAttribute samlAttribute = new SAMLAttribute("email" /* Name*/, new String[] {"joe@websphere"} 
    /*Attribute Values*/, null, "IBM WebSphere namespace" /* namespace*/, "email" /* format*/, "joe" /*friendly name */);
    ArrayList<SAMLAttribute> al = new ArrayList<SAMLAttribute>();
    al.add(samlAttribute)
    sattribute = new SAMLAttribute("Membership", new String[] {"Super users", "Gold membership"}, null, null /* format*/, null, null );
    al.add(samlAttribute );
    cred.setSAMLAttributes(al);
    Este código de amostra gera as seguintes asserções de <Attribute>:
    <saml:Attribute AttributeName="email" NameFormat="email" AttributeNamespace="IBM WebSphere namespace">
    <saml:AttributeValue>joe@websphere</saml:AttributeValue>
    </saml:Attribute>
    <saml:Attribute AttributeName="Membership">
    <saml:AttributeValue>Super users</saml:AttributeValue><saml:AttributeValue>Gold membership</saml:AttributeValue>
    </saml:Attribute>
  5. Gere um token holder-of-key SAML utilizando esta linha de código:
    SAMLToken samlToken = samlFactory.newSAMLToken(cred, reqData, samlIssuerCfg);
    Esse método requer a permissão de segurança Java wssapi.SAMLTokenFactory.newSAMLToken. Amostras de código completas utilizando linhas de código das etapas anteriores estão incluídas na seção Exemplo.

Exemplo

Utilize este código de amostra para criar um token holder-of-key SAML versão 1.1 utilizando uma chave secreta (chave simétrica) do subject.
import com.ibm.wsspi.wssecurity.saml.config.RequesterConfig;
import com.ibm.wsspi.wssecurity.saml.config.ProviderConfig;
import com.ibm.wsspi.wssecurity.saml.config.CredentialConfoig ; 
import com.ibm.websphere.wssecurity.wssapi.token.SAMLTokenFactory 

SAMLTokenFactory samlFactory = SAMLTokenFactory.getInstance(SAMLTokenFactory.WssSamlV11Token11);

RequesterConfig reqData  =  samlFactory.newSymmetricHolderOfKeyTokenGenerateConfig();

//Mapeie "AppliesTo" para o alias de chave, assim a biblioteca saberá como criptografar a Chave Simétrica
reqData.setKeyAliasForAppliesTo("SOAPRecipient"); 

ProviderConfig samlIssuerCfg = samlFactory.newDefaultProviderConfig(IsserUri);

Subject subject =  com.ibm.websphere.security.auth.WSSubject.getRunAsSubject(); 

SAMLToken samlToken = samlFactory.newSAMLToken(subject, reqData, samlIssuerCfg);
Utilize este código de amostra para criar um token holder-of-key SAML versão 2.0 utilizando uma chave pública do subject:
//Expressão do usuário sobre como SAML deve ser criado, o padrão é fornecido
RequesterConfig reqData =  samlFactory.newAsymmetricHolderOfKeyTokenGenerateConfig();

//Escolha uma chave pública para ser incluída no SAML
reqData.setKeyAliasForRequester("SOAPInitiator"); 

//Obtenha o keystore do emissor para poder assinar ou criptografar a asserção, nome do emissor
ProviderConfig samlIssuerCfg = samlFactory.newDefaultProviderConfig("any_issuer");

//Obtenha o JAAS Subject para que o factory possa preencher o principal e o atributo para SAML
Subject subject =  com.ibm.websphere.security.auth.WSSubject.getRunAsSubject(); 

SAMLToken samlToken = samlFactory.newSAMLToken(subject, reqData, samlIssuerCfg);
Utilize este código de amostra para criar um token holder-of-key SAML versão 2.0 utilizando uma chave secreta (chave simétrica):
SAMLTokenFactory samlFactory =  SAMLTokenFactory.getInstance (SAMLTokenFactory.WssSamlV20Token11);

RequesterConfig reqData = samlFactory. newSymmetricHolderOfKeyTokenGenerateConfig ();
//Mapeie "AppliesTo" para o alias de chave, assim a biblioteca saberá como criptografar a Chave Simétrica
reqData.setKeyAliasForAppliesTo("SOAPRecipient"); 

ProviderConfig samlIssuerCfg = samlFactory.newDefaultProviderConfig(null);

CredentialConfig cred = samlFactory.newCredentialConfig ();
cred.setRequesterNameID("any_name"); 

SAMLToken samlToken =  samlFactory.newSAMLToken(subject, reqData, samlIssuerCfg);

Í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_createholderofkeytoken
Nome do arquivo: twbs_createholderofkeytoken.html