Certificado A3 - NFE

Seguinte…
Eu construí uma classe de assinatura digital que funciona perfeitamente com meu certificado A1.

Estou agora tentando generalizar a classe, e faze-la aceitar o A3.
E tou com um GemPCTwin de cartãozinho…

Tenho no meu código:

[code] // declarando auxiliares
char pin[] = “233426”.toCharArray();
String config = “c:\token.cfg”
//registrando provedor
Provider pr = new sun.security.pkcs11.SunPKCS11(config);
java.security.Security.addProvider(pr);

            // recebendo um erro... rsrs**
            KeyStore ks = ks = KeyStore.getInstance("pkcs11");[/code]

Com o arquivo token.cfgname = SmartCard library = c:/windows/system32/aetpkss1.dll enabledMechanisms = { CKM_RSA_PKCS CKM_RSA_PKCS_KEY_PAIR_GEN CKM_MD5 CKM_SHA1_RSA_PKCS CKM_RSA_X_509 }

E o console diz:

[quote]java.security.KeyStoreException: pkcs11 not found
at java.security.KeyStore.getInstance(KeyStore.java:565)
at br.com.upbrasil.jni.NFe.signature(NFe.java:234)
at br.com.upbrasil.jni.NFe.main(NFe.java:305)
[/quote]

Detalhes adicionais:
Provider[] pro = Security.getProviders(); for (int i=0;i<pro.length;i++){ pro[i].list(System.out); } // retorno [...] -- listing properties -- Signature.SHA512withRSA=sun.security.pkcs11.P11Signature Signature.MD5withRSA=sun.security.pkcs11.P11Signature Signature.SHA1withRSA=sun.security.pkcs11.P11Signature Provider.id className=sun.security.pkcs11.SunPKCS11 KeyFactory.RSA=sun.security.pkcs11.P11RSAKeyFactory Provider.id version=1.5 MessageDigest.MD5=sun.security.pkcs11.P11Digest Signature.SHA384withRSA=sun.security.pkcs11.P11Signature KeyPairGenerator.RSA=sun.security.pkcs11.P11KeyPairGenerator Signature.SHA256withRSA=sun.security.pkcs11.P11Signature Provider.id name=SunPKCS11-SmartCard Cipher.RSA/ECB/PKCS1Padding=sun.security.pkcs11.P11RSACipher Signature.MD2withRSA=sun.security.pkcs11.P11Signature Provider.id info=SunPKCS11-SmartCard using library c:/...

E, o -Djava.security.debug=sunpkcs11,pkcs11

[quote]sunpkcs11: Initializing PKCS#11 library c:/windows/system32/aetpkss1.dll
Information for provider SunPKCS11-SmartCard
Library info:
cryptokiVersion: 2.11
manufacturerID: A.E.T. Europe B.V.
flags: 0
libraryDescription: Cryptographic Token Interface
libraryVersion: 2.00
All slots: 52481, 52482, 52483, 52484
Slots with tokens: 52483
Slot info for slot 52483:
slotDescription: Gemplus USB Smart Card Reader 0
manufacturerID: Gemplus USB Smart Card Reader 0
flags: CKF_TOKEN_PRESENT | CKF_REMOVABLE_DEVICE | CKF_HW_SLOT
hardwareVersion: 0.00
firmwareVersion: 0.00
Token info for token in slot 52483:
label: e-CNPJ Fenacon
manufacturerID: A.E.T. Europe B.V.
model: 23840D0703070000
flags: CKF_RNG | CKF_LOGIN_REQUIRED | CKF_USER_PIN_INITIALIZED | CKF_TOKEN_INITIALIZED
ulMaxSessionCount: 64
ulSessionCount: 0
ulMaxRwSessionCount: 64
ulRwSessionCount: 0
ulMaxPinLen: 8
ulMinPinLen: 4
ulTotalPublicMemory: 8650
ulFreePublicMemory: 3512
ulTotalPrivateMemory: 234
ulFreePrivateMemory: 234
hardwareVersion: 0.00
firmwareVersion: 0.00
utcTime:
Mechanism CKM_RSA_PKCS_KEY_PAIR_GEN:
ulMinKeySize: 720
ulMaxKeySize: 1024
flags: 65537 = CKF_HW | CKF_GENERATE_KEY_PAIR
Mechanism CKM_RSA_PKCS:
ulMinKeySize: 720
ulMaxKeySize: 1024
flags: 424705 = CKF_HW | CKF_ENCRYPT | CKF_DECRYPT | CKF_SIGN | CKF_SIGN_RECOVER | CKF_VERIFY | CKF_VERIFY_RECOVER | CKF_WRAP | CKF_UNWRAP
Mechanism CKM_RSA_X_509:
ulMinKeySize: 720
ulMaxKeySize: 1024
flags: 424705 = CKF_HW | CKF_ENCRYPT | CKF_DECRYPT | CKF_SIGN | CKF_SIGN_RECOVER | CKF_VERIFY | CKF_VERIFY_RECOVER | CKF_WRAP | CKF_UNWRAP
Mechanism CKM_RC2_KEY_GEN:
DISABLED in configuration
ulMinKeySize: 8
ulMaxKeySize: 1024
flags: 32768 = CKF_GENERATE
Mechanism CKM_RC2_ECB:
DISABLED in configuration
ulMinKeySize: 1
ulMaxKeySize: 1024
flags: 393984 = CKF_ENCRYPT | CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP
Mechanism CKM_RC2_CBC:
DISABLED in configuration
ulMinKeySize: 1
ulMaxKeySize: 1024
flags: 393984 = CKF_ENCRYPT | CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP
Mechanism CKM_RC2_CBC_PAD:
DISABLED in configuration
ulMinKeySize: 1
ulMaxKeySize: 1024
flags: 393984 = CKF_ENCRYPT | CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP
Mechanism CKM_RC4_KEY_GEN:
DISABLED in configuration
ulMinKeySize: 8
ulMaxKeySize: 2048
flags: 32768 = CKF_GENERATE
Mechanism CKM_RC4:
DISABLED in configuration
ulMinKeySize: 8
ulMaxKeySize: 2048
flags: 393984 = CKF_ENCRYPT | CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP
Mechanism CKM_DES_KEY_GEN:
DISABLED in configuration
ulMinKeySize: 0
ulMaxKeySize: 0
flags: 32768 = CKF_GENERATE
Mechanism CKM_DES_ECB:
DISABLED in configuration
ulMinKeySize: 0
ulMaxKeySize: 0
flags: 393984 = CKF_ENCRYPT | CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP
Mechanism CKM_DES_CBC:
DISABLED in configuration
ulMinKeySize: 0
ulMaxKeySize: 0
flags: 393984 = CKF_ENCRYPT | CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP
Mechanism CKM_DES_CBC_PAD:
DISABLED in configuration
ulMinKeySize: 0
ulMaxKeySize: 0
flags: 393984 = CKF_ENCRYPT | CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP
Mechanism CKM_DES2_KEY_GEN:
DISABLED in configuration
ulMinKeySize: 0
ulMaxKeySize: 0
flags: 32768 = CKF_GENERATE
Mechanism CKM_DES3_KEY_GEN:
DISABLED in configuration
ulMinKeySize: 0
ulMaxKeySize: 0
flags: 32768 = CKF_GENERATE
Mechanism CKM_DES3_ECB:
DISABLED in configuration
ulMinKeySize: 0
ulMaxKeySize: 0
flags: 393984 = CKF_ENCRYPT | CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP
Mechanism CKM_DES3_CBC:
DISABLED in configuration
ulMinKeySize: 0
ulMaxKeySize: 0
flags: 393984 = CKF_ENCRYPT | CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP
Mechanism CKM_DES3_CBC_PAD:
DISABLED in configuration
ulMinKeySize: 0
ulMaxKeySize: 0
flags: 393984 = CKF_ENCRYPT | CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP
Mechanism CKM_MD2:
DISABLED in configuration
ulMinKeySize: 0
ulMaxKeySize: 0
flags: 1024 = CKF_DIGEST
Mechanism CKM_MD5:
ulMinKeySize: 0
ulMaxKeySize: 0
flags: 1024 = CKF_DIGEST
Mechanism CKM_SHA_1:
DISABLED in configuration
ulMinKeySize: 0
ulMaxKeySize: 0
flags: 1024 = CKF_DIGEST
Mechanism CKM_RIPEMD160:
DISABLED in configuration
ulMinKeySize: 0
ulMaxKeySize: 0
flags: 1024 = CKF_DIGEST
Mechanism CKM_MD5_RSA_PKCS:
DISABLED in configuration
ulMinKeySize: 720
ulMaxKeySize: 1024
flags: 10241 = CKF_HW | CKF_SIGN | CKF_VERIFY
Mechanism CKM_SHA1_RSA_PKCS:
ulMinKeySize: 720
ulMaxKeySize: 1024
flags: 10241 = CKF_HW | CKF_SIGN | CKF_VERIFY
Mechanism CKM_RIPEMD160_RSA_PKCS:
DISABLED in configuration
ulMinKeySize: 720
ulMaxKeySize: 1024
flags: 10241 = CKF_HW | CKF_SIGN | CKF_VERIFY
Mechanism Unknown 0x0000000080000001:
DISABLED in configuration
ulMinKeySize: 720
ulMaxKeySize: 1024
flags: 10241 = CKF_HW | CKF_SIGN | CKF_VERIFY[/quote]

Bem…
Eu não consigo usar essa coisa…
Aceito dicas, sugestoes, conselhos, rezas e romarias e tudo mais…
Teoricamente… tudo deveria funcionar…

pliz, reupi mi

ja tentou inverter as barras no arquivo token.cfg? Vc precisa realmente de todas essas configurações no arquivo? Os meus ficam tão mais simples…

Baaah,
Eu achei que precisava…
na verdade… TUDO ali é tentativa…
Não achei nenhum manual de como fazer essas coisas…
e, os exemplos são todos tão simplezinhos que… de boa…
nem sei oq pensar na hora que dá erro…

Dai pensei… Deve ser alguma particularidade da minha DLL…
pqp… se pra cada cliente que comprar um hardware novo eu tiver toda essa batalha eu tou f*****

Boum…Voltando ao problema
eu retirei as configurações de mecanismos
e o arquivo cfg ficou name = SmartCard library = c:/windows/system32/aetpkss1.dll

O que me resultou um erro num local afrente do habitual.
e, o debug retornou um [quote]sunpkcs11: login succeeded[/quote]
Sinal de que a configuração era um dos problemas…

Agora deu erro no uso de aliases,
Creio que agora seja questão de codificação aqui…

Eita trem chato esse tal de A3…
Se tiver mais problema eu retorno nesse mesmo bat canal… rs**

Mas,
Aqui…
Eu nada fiz de diferente.
E, aparentemente ele sempre carregava a dll…
não entendi o que está diferente…

qual eh o servidor de aplicação usado?
tomcat??

se for pode ser que vc precise configurar la no server.xml do tomcat
na tag connector preste atenção que eh na porta 8443
coloque a senha do key

preciso da dica de como fazer isso no glassfish
se alguem souber por favor me digam

Bom, estou nesta mesma batalha também!
Certificado A1 foi mamão com açúcar… agora este A3
está me dando dor de cabeça.

Já fiz download de n componentes e não obtive sucesso com nada,
alguém poderia me dar uma luz, como assinar o XML com esse “querido”
certificado A3.

Att.

Ernani Cesar S.

É igualzinho…
A diferença é q o a3 varia com o hardware…
Então…
A solução começa com o Hardware…

  1. achar os parâmetros do seu hardware
  2. Modificar seus fontes pra a3.

[code] PrivateKey privateKey = null;
KeyStore.PrivateKeyEntry pkEntry = null;
KeyStore ks = null;

        //------------------------------------------------------------------
        //         Carregando a keyStore com o certificado
        //------------------------------------------------------------------
        if (tipoCert == null || "A1".equals(tipoCert)) {
            ks = KeyStore.getInstance(tipo);
            FileInputStream fis = 
                new FileInputStream(new File(APPSet.getProperty("certificado")));
            ks.load(fis, pin);

        } else if ("A3".equals(tipoCert)) {
            Provider pr = new sun.security.pkcs11.SunPKCS11(config);
            java.security.Security.addProvider(pr);

            ks = KeyStore.getInstance("pkcs11");
            ks.load(null, pin);
        }[/code]

Pegou a ideia?
dai… na requisição… mesma coisa…

Olha kra… é isso que eu estou fazendo, só que na hora de dar o load no KeyStore está dando um erro:
PKCS11 NOT FOUND, já baixei a dll do fabricante e nada, o erro continua!
E tem outra, quando eu uso o A1 eu extraio a PrivateKey do meu certificado para fazer a assinatura, o que eu
não posso fazer com o A3, como eu faço para mandar o meu Hardware assinar a minha Nota?
O meu leitor é umj GemPC Twin, meu cartão é um GemPlus.

O colega ou alguém poderia me ajudar, postar um exemplo por favor!

At…

Ernani César dos Santos

estou postando uma parte dos meus codigos
espero que ajudem a resolver

arquivo token.cfg

[code]name=Safesig

library = C:\WINDOWS\system32\aetpkss1.dll[/code]

Aqui codigo para aplicar a segurança de conexao

        [code]Provider p = new sun.security.pkcs11.SunPKCS11(caminho do token);
        Security.addProvider(p);
        KeyStore ks = KeyStore.getInstance(tipo key store);
        ks.load(null, "senha".toCharArray());

        System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
        System.setProperty("javax.net.ssl.keyStoreType",ks.getType());
        System.setProperty("javax.net.ssl.keyStorePassword", "senha pin");//Aqui a senha deste certificado

        System.setProperty("javax.net.ssl.trustStoreType","JKS");
        System.setProperty("javax.net.ssl.trustStore", caminho KeyStore); //Aqui vem o arquivo criado atraves do comando keytool chaves publicas 
        System.setProperty("javax.net.ssl.trustStorePassword", senha keystore);[/code]

aqui codigo para pegar o certificado
opção aqui de arquivo e e-certificados

    [code]KeyStore ks = null;
    // Load the KeyStore and get the signing key and certificate.
    if(CERT_ARQUIVO)
    {
        System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        ks = KeyStore.getInstance("pkcs12");
        ks.load(new FileInputStream("CAMINHO CERTIFICADO", "SENHA CERTIFICADO");
        
    }else
    {
        Provider p = new sun.security.pkcs11.SunPKCS11("CAMINHO TOKEN.CFG");
        Security.addProvider(p);

        ks = KeyStore.getInstance("pkcs11");
        ks.load(null, "SENHA".toCharArray());

    }
    KeyStore.PrivateKeyEntry pkEntry = null;
    Enumeration aliasesEnum = ks.aliases();

    while (aliasesEnum.hasMoreElements()) 
    {
        String alias = (String) aliasesEnum.nextElement();
        System.out.println(alias);

        if (ks.isKeyEntry(alias)) 
        {
            pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection("SENHA".toCharArray()));
            privateKey = pkEntry.getPrivateKey();
            break;
        }
    }

    X509Certificate cert = (X509Certificate) pkEntry.getCertificate();
    
    return cert;[/code]

PatricMaffi o seu código está muito parecido com o meu, na verdade estou fazendo o meu código baseado no Nakov Document Signer, só que estou com um problema: uma vez inserida o pin code correto, é possível fazer qualquer operação com o token que funciona, até mesmo fazendo um load da keystore com a senha errada: keyStore.load(null, “senha errada”, provider).

Já tentei até dá um remove no provider criado a partir do arquivo de configuração e nada.

Ola, estevao
quando você tentou remover o provider
utilizou este comando
Security.removeProvider(nome_provider); ??

se foi este e não funcionou tente este
Security.getProvider(nome_provider).clear();

A aproveitando a deixa, desenvolvemos um sisteminha com webservice para solução de comunicação de NFe para empresas de software que estejam precisando fazer a parte de NFe para integrar com os seus sistemas de ERP

se alguem tiver curiosidade de como funciona nosso webservice de comunicação com a receita me envie um e-mail

espero ter ajudado

abraços

Isso eu tentei remover com Security.removeProvider("SunPKCS11-SmartCard"); e nada, e agora quando eu uso Security.getProvider("SunPKCS11-SmartCard").clear(); dá o seguinte erro depois da primeira assinatura bem sucedida:

java.security.KeyStoreException: PKCS11 not found Caused by: java.security.NoSuchAlgorithmException: PKCS11 KeyStore not available O que eu devo fazer agora, seria legal se estivesse um código para saber o que eu fazendo de errado.

[quote=PatricMaffi]estou postando uma parte dos meus codigos
espero que ajudem a resolver

arquivo token.cfg

[code]name=Safesig

library = C:\WINDOWS\system32\aetpkss1.dll[/code]

Aqui codigo para aplicar a segurança de conexao

        [code]Provider p = new sun.security.pkcs11.SunPKCS11(caminho do token);
        Security.addProvider(p);
        KeyStore ks = KeyStore.getInstance(tipo key store);
        ks.load(null, "senha".toCharArray());

        System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
        System.setProperty("javax.net.ssl.keyStoreType",ks.getType());
        System.setProperty("javax.net.ssl.keyStorePassword", "senha pin");//Aqui a senha deste certificado

        System.setProperty("javax.net.ssl.trustStoreType","JKS");
        System.setProperty("javax.net.ssl.trustStore", caminho KeyStore); //Aqui vem o arquivo criado atraves do comando keytool chaves publicas 
        System.setProperty("javax.net.ssl.trustStorePassword", senha keystore);[/code]

[/quote]

Puts valeu, era o que eu precisava, como setar o A3 para a chamada dos webServices.
Mas o meu ainda ficou um pouco mais simples. Porque eu estava lendo, que voce pode ter mais de um Provider adicionado, para varios certificados na mesma app/maquina, entao ele pega pelo nome, que esta la no config.cfg, e nao preciso instanciar um keystore para isso, pois a maioria dos webservices da NFe eu nao preciso assinar o xml, apenas setar para a comunicaçao.

private void setSecurity(boolean token) {
        
        System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");        
        if (token) {

            System.setProperty("javax.net.ssl.keyStoreType", parametros.getProperty("nfe.certificado.tipo"));
            System.setProperty("javax.net.ssl.keyStore", "NONE");
            System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-SmartCard");  //PERCEBA AQUI, tambem poderia ter pego das properties, pra ficar dinamico
            System.setProperty("javax.net.ssl.keyStorePassword", parametros.getProperty("nfe.certificado.pfx.pass"));
        } else {
            Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
            System.setProperty("javax.net.ssl.keyStoreType", parametros.getProperty("nfe.certificado.tipo"));
            System.setProperty("javax.net.ssl.keyStore", parametros.getProperty("nfe.certificado.pfx"));
        }
        System.setProperty("javax.net.ssl.trustStoreType", "JKS");
        System.setProperty("javax.net.ssl.trustStore", parametros.getProperty("nfe.certificado.keystore"));
    }

[quote=estevaofreitas]Isso eu tentei remover com Security.removeProvider("SunPKCS11-SmartCard"); e nada, e agora quando eu uso Security.getProvider("SunPKCS11-SmartCard").clear(); dá o seguinte erro depois da primeira assinatura bem sucedida:

java.security.KeyStoreException: PKCS11 not found Caused by: java.security.NoSuchAlgorithmException: PKCS11 KeyStore not available O que eu devo fazer agora, seria legal se estivesse um código para saber o que eu fazendo de errado.[/quote]

E nao esta correto? Afinal voce removeu o certificado. Assine todas as notas e no final remova o certificado. Para novas assinaturas adicione novamente.

veja este tuto que encontrei

Buenas,

Alguém implementou a solução dentro do JBoss?
Caso positivo, peço encarecidamente um auxílio. Não consigo fazer ele funcionar com A3.

Obrigado.
Abraços.

Olá,

No código do PatricMaffi, ele da um return cert porém nao informa onde ele usar esse certificado e nem o nome do metodo criado.

Gostaria que se possivel mostrasse um exemplo completo ate a forma de chamar a consulta no ws.

Respondendo a uma duvida que o benignoms me perguntou em PM.

Lembrando que este exemplo serve apenas para assinar a conexao.

arquivo token.cfg

name = SmartCard
library = C:/WINDOWS/system32/aetpkss1.dll

No meu caso estou utilizando o smart-card do SERASA, deve-se instalar os arquivos dele, baixados do site do SERASA, se usa um diferente tem que saber qual a DLL PKCS11 dele.

codigo para setar a conexao, serve tanto pra A1: PKCS12, quanto para A3 token: PKCS11, bastando passar true se for token.

private void setSecurity(boolean token) {
        System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
        if (token) {
            Provider p = new sun.security.pkcs11.SunPKCS11("c:\\nfe\\certificados\\token.cfg");
            Security.addProvider(p);

            System.setProperty("javax.net.ssl.keyStoreType", parametros.getProperty("nfe.certificado.tipo"));
            System.setProperty("javax.net.ssl.keyStore", "NONE");
            System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-SmartCard");
            System.setProperty("javax.net.ssl.keyStorePassword", parametros.getProperty("nfe.certificado.pass"));
        } else {
            Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
            System.setProperty("javax.net.ssl.keyStoreType", parametros.getProperty("nfe.certificado.tipo"));
            System.setProperty("javax.net.ssl.keyStore", parametros.getProperty("nfe.certificado.pfx"));
            System.setProperty("javax.net.ssl.keyStorePassword", parametros.getProperty("nfe.certificado.pass"));
        }
        System.setProperty("javax.net.ssl.trustStoreType", "JKS");
        System.setProperty("javax.net.ssl.trustStore", parametros.getProperty("nfe.certificado.keystore"));
    }

conteudo do arquivo Properties:

nfe.certificado.pfx=c:/nfe/certificados/CERTIFICADO.pfx  //necessario se for A1 em arquivo e nao token.
nfe.certificado.pass=SENHA
nfe.certificado.keystore=c:/nfe/certificados/KeyStore.jks
nfe.certificado.tipo=PKCS11  //se for A1, trocar por PKCS12

o keystore tu cria + ou - assim:

C:\Program Files\Java\jre1.6.0_05\bin\keytool -importcert -trustcacerts -alias icp_br -file CertificadoACRaiz.cer -keystore keystore.jks
No meu caso eu entrei no site da receita que exige certificado e exportei ele para um .CER, entao criei o keystore.

Agora isso tudo serve apenas para assinar uma conexao, se der certo o maximo que tu vai ver é a luzinha do token dar umas piscadas, entao a conexao ja estara assinada, agora se tu pretende assinar um arquivo ai o caminho é por aqui:
na parte de pegar a key:

// Load the KeyStore and get the signing key and certificate.
        KeyStore ks = null;
        if (token) {
            Provider p = new sun.security.pkcs11.SunPKCS11("c:/nfe/certificados/token.cfg");
            Security.addProvider(p);
            ks = KeyStore.getInstance("PKCS11");
            ks.load(null, keyStorePass.toCharArray());
            

        } else {

            ks = KeyStore.getInstance("PKCS12");
            FileInputStream fis = new FileInputStream(certificado);
            //load the keystore
            ks.load(fis, keyStorePass.toCharArray());
        }

[edit]
Fui reler o topico e vi que tudo que falei ja tinha aqui. benignoms, qual é realmente tua duvida?

Cara, pra que vc criou esse setSecurity se voce nao utiliza?

Como nao utilizo? Toda vez que vou chamar um WebService eu faço uma chamada a este metodo.

Eu nao postei, mas ele é chamado para setar a seguranca antes de fazer a chamada ao WebService.

agora sim… :smiley: :lol:

eae amigos, tive que adaptar meu cod pra ler esse A3, mas desculpem a ignorancia da onde vem esse arquivo token.cfg ?