Carregar certificado A3 com dois ou mais certificados (2 SmartCard e 1 Token)

Estou tendo uma dificuldade em carregar um certificado determinado pela aplicação quando
no servidor estão instalados 2 ou mais certificados, cada um, em diferentes dispositivos físicos (2 SmartCard e 1 Token).

String configName = certificado.getFileConfig();   
String alias = certificado.getAlias();   
String senha = Crypto.decryptAES(certificado.getPassword());   
if (p == null) {   
    p = new sun.security.pkcs11.SunPKCS11(configName);   
    Security.addProvider(p);   
}   
  
try {   
    System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");   
    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());   
  
    KeyStore ks = KeyStore.getInstance("pkcs11", p);   
    ks.load(null, senha.toCharArray());   
  
    Enumeration<String> aliasEnum = ks.aliases();   
    while (aliasEnum.hasMoreElements()) {   
        String aliasKey = (String) aliasEnum.nextElement();   
        System.out.print(aliasKey + "\n");   
    }   
  
    chavePrivada = (Key) ks.getKey(alias, senha.toCharArray());   
  
    cert = (X509Certificate) ks.getCertificate(alias);   
    if (cert != null) {   
        System.out.println(getValidade(cert));   
    } else {   
        System.out.println("Certificado nulo!!!");   
    }   
  
    System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");   
    System.setProperty("javax.net.ssl.keyStore", "NONE");   
    System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-SmartCard");   
  
} catch (KeyStoreException e) {   
    e.printStackTrace();   
} catch (NoSuchAlgorithmException e) {   
    e.printStackTrace();   
} catch (CertificateException e) {   
    e.printStackTrace();   
} catch (IOException e) {   
    e.printStackTrace();   
} catch (UnrecoverableKeyException e) {   
    e.printStackTrace();   
}  

A aplicação sempre retorna um certificado, apesar de terem dois ou mais instalados no servidor.

CERTIFICADO 1's AC Certisign Multipla G3 ID  

Eu esperava que o método ks.aliases() retornasse todos os certificados:

CERTIFICADO 1's AC Certisign Multipla G3 ID   
CERTIFICADO 2's AC Certisign Multipla G3 ID   
CERTIFICADO 3's AC Certisign Multipla G3 ID   
CERTIFICADO ...'s AC Certisign Multipla G3 ID  

Alguém pode me ajudar?

Como que é sua aplicação? web ou desktop?

Sugiro que vc peça para o usuario escolher o certificado, mas como o usuario não entende de certificado, antes de emitir a nota fiscal vc pode para ele escolher qual empresa que vai emitir a NFe.

O meu sistema é assim, quando o cara loga no sistema eu ja sei qual cnpj vou usar, com isso eu ja sei qual o certificado do cara.

Nao sei se ajudou!!!

Att

A aplicação é web e multi-empresa, quando o usuário está logado, já esta amarrado ao certificado.
O problema eh justamente conseguir dentre os três certificados, conseguir selecionar um.
Porque quando carrego o provedor:

p = new sun.security.pkcs11.SunPKCS11(configName);
KeyStore ks = KeyStore.getInstance("pkcs11", p);     
ks.load(null, senha.toCharArray());   

a aplicação não esta carregando dos três certificados, somente do primeiro SmartCard, aí não tem como
eu escolher. Se eu deixar somente o certificado específico, e tirar os outros dois, funciona de boa.

https://forums.oracle.com/forums/thread.jspa?messageID=6411729

Vai o pedaço do meu codigo que eu uso para selecionar os meus certifcados


   // Load the KeyStore and get the signing key and certificate.

            UsuarioKeyStore usuarioKeyStore = UsuarioKeyStore.buscarDados(usuario);

            NFeLogger.logInfo("(A1) Carregando o Keystore ...", null);
            String trustStoreType = usuarioKeyStore.getTrustStoreType();
            NFeLogger.logInfo("(A1) trustStoreType utilizado " + trustStoreType, null);
            KeyStore ks = KeyStore.getInstance(trustStoreType);
            String senhaKeyStore = usuarioKeyStore.getSenhaKeyStore();
            String endereco = usuarioKeyStore.getEnderecoKeyStore();
            NFeLogger.logInfo("(A1) Endereco do keystore " + endereco, null);
            ks.load(new FileInputStream(endereco), senhaKeyStore.toCharArray());
            String aliasPfx = usuario.getAliasPfx();
            NFeLogger.logInfo("(A1) Alias PFX " + aliasPfx, null);
            KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(aliasPfx, new KeyStore.PasswordProtection(senhaKeyStore.toCharArray()));

            Enumeration aliasesEnum = ks.aliases();
            PrivateKey privateKey = null;

            while (aliasesEnum.hasMoreElements()) {
                String alias = (String) aliasesEnum.nextElement();
                NFeLogger.logInfo("(A1) Alias " + alias, null);
                if (alias.equalsIgnoreCase(usuario.getAliasPfx())) {
                    if (ks.isKeyEntry(alias)) {
                        pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(senhaKeyStore.toCharArray()));
                        privateKey = pkEntry.getPrivateKey();
                        break;
                    }
                }
            }