Gerando e Consumindo um Token X.509 Dinâmico Usando um Módulo de Login JAAS Empilhado

É possível usar as SPIs GenericSecurityTokenFactory para criar tokens X.509 a serem usados pelo ambiente do tempo de execução do WS-Security. Esses tokens de segurança podem ser usados para, mas não limitados a, WSSAPIs e módulos de login do JAAS.

Sobre Esta Tarefa

Quando uma SPI GenericSecurityTokenFactory é usada para criar um token X.509 que não contém XML, o token pode ser emitido somente pelo gerador X.509 e consumido pelo consumidor X.509. Portanto, um token X.509 é considerado um token simples, que é destinado a uso somente pelo seu respectivo gerador ou consumidor específico do token. Um token X.509 não pode ser emitido pelo GenericSecurityTokenLoginModule.

O GenericSecurityTokenFactory fornece várias SPIs que podem ser usadas para criar tokens X.509 que podem ser emitidos com o X509GenerateLoginModule ou consumidos pelo X509ConsumeLoginModule. Os tokens X.509 criados usados uma SPI GenericSecurityTokenFactory contêm chaves públicas e/ou privadas que podem ser usadas para assinar ou criptografar uma mensagem de saída ou para decriptografar ou verificar a assinatura de uma mensagem de entrada.

Talvez você deseje usar este tipo de token:
  • Caso seja necessário alterar dinamicamente a chave de assinatura para uma mensagem. Por exemplo, o X509GenerateCallbackHandler requer que a chave de assinatura seja codificada permanentemente no momento da configuração. Caso seja necessário substituir esse valor codificado permanentemente, será possível codificar um módulo de login do JAAS que esteja empilhado sobre o X509GenerateLoginModule para que o módulo de login coloque um token X.509 simples no estado compartilhado. Em seguida, o X509GenerateLoginModule usa a chave privada especificada no token X.509 simples para substituir a configurada no manipulador de retorno de chamada.
  • Se precisar permitir diversos certificados de verificação de assinatura que não aparecem na mensagem SOAP. Essas mensagens incluiriam certificados referidos por atributos, como KEYID e X509IssuerSerial. O mecanismo WS-Security não resolve dinamicamente os certificados que não aparecem na mensagem SOAP. O certificado deve ser codificado permanentemente no X509ConsumeCallbackHandler e é possível configurar somente um certificado no manipulador de retorno de chamada. Se você escolher implementar sozinho um código que resolva o certificado, será possível colocar esse código em um módulo de login do JAAS que esteja empilhado sobre o X509ConsumeLoginModule e, em seguida, colocar um token X.509 simples no estado compartilhado que contenha o certificado público desejado. O X509ConsumeLoginModule usa, então, o certificado público especificado no token X.509 simples para substituir o configurado no manipulador de retorno de chamada.

Depois que um token X.509 for criado, as chaves pública e privada no token não poderão ser modificadas. Portanto, você deve determinar o tipo de token que deseja criar e, em seguida, emita comandos semelhantes aos especificados nas etapas a seguir para criar seu token e módulo de login do JAAS.

Procedimento

  1. Crie um token X.509 simples

    Decida o tipo de token X.509 simples que deseja criar e emita comandos semelhantes a uma das seguintes séries de comandos.

    1. Crie um token X.509 simples com um certificado público.
      import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
      import com.ibm.websphere.wssecurity.wssapi.token.X509Token;
      import java.security.cert.X509Certificate;
      ...
      
      X509Certificate publicCert = null;
      
      GenericSecurityTokenFactory factory = GenericSecurityTokenFactory.getInstance();
      
      //implement code to obtain the public certificate
      
      X509Token x509 = factory.getSimpleX509PublicToken(publicCert);
    2. Crie um token X.509 simples com uma chave privada e uma pública opcional.
      import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
      import com.ibm.websphere.wssecurity.wssapi.token.X509Token;
      import java.security.Key;
      import java.security.cert.X509Certificate;
      ...
      
      Key privateKey = null;
      X509Certificate publicCert = null;
      
      GenericSecurityTokenFactory factory = GenericSecurityTokenFactory.getInstance();
      
      //implement code to obtain the private key
      //optionally implement code to obtain the public certificate
      
      X509Token x509 = null;
      try {
       x509 = factory.getSimpleX509PrivateToken(publicCert , privateKey);
      } catch (WSSException ex) {
       //throws an exception if privateKey is null
      }
  2. Crie um módulo de login do JAAS que pode ser empilhado sobre X509GenerateLoginModule ou X509ConsumeLoginModule.
    package test.tokens;
    import com.ibm.websphere.wssecurity.wssapi.token.GenericSecurityTokenFactory;
    import com.ibm.websphere.wssecurity.wssapi.WSSUtilFactory;
    import java.util.Map;
    
    import javax.security.auth.Subject;
    import javax.security.auth.callback.CallbackHandler;
    import javax.security.auth.login.LoginException;
    import javax.security.auth.spi.LoginModule;
    
    import com.ibm.websphere.wssecurity.wssapi.token.X509Token;
    import java.security.KeyStore;
    import java.security.cert.X509Certificate;
    
    public class MyX509LoginModule implements LoginModule {
      //For the sake of readability, this login module does not
      //protect against all NPE's
    
      private Map _sharedState;
      private Map _options;
      private CallbackHandler _handler;
    
      public void initialize(Subject subject, CallbackHandler callbackHandler,
                  Map<String, ?> sharedState, Map<String, ?> options) {
    
        this._handler = callbackHandler;
        this._sharedState = sharedState;
        this._options = options;  
      }
    
      public boolean login() throws LoginException {
    
        GenericSecurityTokenFactory factory = null;
        WSSUtilFactory utilFactory = null;
        try {
          factory = GenericSecurityTokenFactory.getInstance();
          utilFactory = WSSUtilFactory.getInstance();
        } catch (Exception e) {
          throw new LoginException(e.toString());
        }
    
        X509Token x509 = null;
        try {
          x509 = getX509Token(factory, utilFactory);
        } catch (Exception e) {
          throw new LoginException("Exception: "+e.toString());
        }
    
        //if generating (signing/encrypting):
        factory.putGeneratorTokenToSharedState(this._sharedState, x509);
    
        //if consuming (decrypting/signature verification):
        factory.putConsumerTokenToSharedState(this._sharedState, x509);
    
        return true;
      }
    
      public X509Token getX509Token (GenericSecurityTokenFactory factory, 
    				 WSSUtilFactory utilFactory) throws Exception{
        //This sample uses a sample keystore
        final String KEYSTORE = "c:/WebSphere/AppServer/profiles/AppSrv01/etc/ws-security/samples/dsig-sender.ks";
        final String KEYSTORE_PASS = "client";
        final String ALIAS = "soaprequester";
        final String ALIAS_PASS = "client";
        final String KEYSTORE_TYPE = "jks";
    
        X509Certificate publicKey = null;
        java.security.Key privateKey = null;
        java.security.cert.Certificate cert = null;
        X509Token x509 = null;
    
        //if you need to get the inbound token so that you can do some processing 
        //to determine which certificate to obtain, get then OMElement for the inbound token
        Map wssContext = utilFactory.GetWSSContext(this._handler);
        org.apache.axiom.om.OMElement element = utilFactory.getProcessingElement(wssContext);
    
        //Open the keystore
        java.security.KeyStore keystore = utilFactory.getKeyStore(KEYSTORE_TYPE, KEYSTORE, KEYSTORE_PASS.toCharArray());
    
        //Get the entry from the keystore
        KeyStore.PasswordProtection pwdProtection = null;
        if (ALIAS_PASS != null) {
          pwdProtection = new KeyStore.PasswordProtection(ALIAS_PASS.toCharArray());
        }
        KeyStore.Entry entry = keystore.getEntry(ALIAS, pwdProtection);
    
        //Get the public and/or private key from the entry
        if (entry instanceof KeyStore.PrivateKeyEntry) {
          //entry is a private key
          KeyStore.PrivateKeyEntry pkentry = (KeyStore.PrivateKeyEntry)entry;
          cert = pkentry.getCertificate();
          privateKey = pkentry.getPrivateKey();
        } else if (entry instanceof KeyStore.TrustedCertificateEntry) {
          //entry is a public key
          KeyStore.TrustedCertificateEntry tcentry = (KeyStore.TrustedCertificateEntry)entry;
          cert = tcentry.getTrustedCertificate();           
        }
        if ((cert != null) && (cert instanceof X509Certificate)) {
          publicKey = (X509Certificate)cert;
        } else {
          throw new LoginException("Certificate is not X509Certificate");
        }
    
        x509 = factory.getSimpleX509Token(publicKey, privateKey);
    
        if (x509 == null) {
          throw new LoginException("X509Token is null");
        }
    
        return x509;
      }
    
    }
  3. Crie uma configuração de login do JAAS.
    Nota: Esta etapa supõe que você esteja empilhando no X509GenerateLoginModule para gerar um token. Se desejar empilhar no X509ConsumeLoginModule para consumir um token, você deve ajustar as etapas para acomodar essa variação.
    1. No console administrativo, acesse Segurança > Segurança Global.
    2. Sob Autenticação, acesse Java Authentication and Authorization Service > Logins no Sistema.
    3. Clique em Novo e, sob Alias, insira test.generate.x509.
    4. Sob Módulos de Login do JAAS, clique em Novo e sob Nome da Classe do Módulo, insira test.tokens.MyX509LoginModule. Selecione Usar Proxy do Módulo de Login e clique em OK.
    5. Clique em Novo e, sob Nome da Classe do Módulo, insira com.ibm.ws.wssecurity.wssapi.token.impl.X509GenerateLoginModule. Clique OK.
    6. Clique em JAAS - Logins do sistema na trilha de navegação para retornar à página de logins do sistema JAAS.
  4. Configure seu gerador de token X.509 para usar a nova configuração de JAAS.
    Nota: Esta etapa supõe que você esteja empilhando no X509GenerateLoginModule para gerar um token. Se desejar empilhar no X509ConsumeLoginModule para consumir um token, você deve ajustar as etapas para acomodar essa variação.
    1. No console administrativo, abra a configuração de ligação que deseja alterar.
    2. Selecione WS-Security > Autenticação e Proteção.
    3. Sob Tokens de Autenticação, selecione o token X.509 de saída que deseja alterar.
    4. Sob Login do JAAS, selecione test.generate.x509.
    5. Clique em OK e, em seguida, em Salvar.
  5. Reinicie o servidor de aplicativos para aplicar as mudanças na configuração do JAAS.
  6. Teste o serviço.

Í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_createx509tokens
Nome do arquivo: twbs_createx509tokens.html