Certificado A3 - NFE

60 respostas
P

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:
// 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");
Com o arquivo token.cfg
name = 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:

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)

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

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

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

60 Respostas

T

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…

P

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

sunpkcs11: login succeeded

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…

P

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

E

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.

P
É 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.
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);
            }

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

E

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

P

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

arquivo token.cfg

name=Safesig

library =  C:\WINDOWS\system32\aetpkss1.dll

Aqui codigo para aplicar a segurança de conexao

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

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

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;
E

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.

P

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

E

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.

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

arquivo token.cfg

name=Safesig

library =  C:\WINDOWS\system32\aetpkss1.dll

Aqui codigo para aplicar a segurança de conexao

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

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"));
    }
F

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.

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

L

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.

B

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.

F

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?

B

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

F

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.

B

agora sim… :smiley: :lol:

A

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

F

Voce deve cria-lo e adicionar aquelas duas linhas do exemplo acima.

X

Olá galera!
Procurei aqui no forum alguém com problema semelhantes, porém não encontrei nada parecido… hehe
Então como se trata de certificado A3 para NFe resolvi postar aqui um problema que tenho.

Seguinte… para A1 tudo ok.
Para A3 NFe tudo ok também.
Porém para A3 e-CNPJ não estou conseguindo assinar a conexão com os webservices. Tive um problema semelhante com o A1 e-CNPJ, porém resolvi adicionando ao certificado pfx a cadeia de certificados pertencentes a ele.
Creio que esse seja meu problema com o A3 e-CNPJ.
Só que… como faria para adicionar essa cadeia de certificados a ele?

Vou explicar como faço a comunicação, talvez seja até outro erro:
Abaixo segue o código para testar o status (que funciona para A1 e A3 NFe e o A1 e-CNPJ)
Ah, um detalhe já… testei pelo browser e funciona acessando o webservice com o A3 e-CNPJ, então o certificado é válido.
E outro detalhe também importante, eu consigo assinar uma NFe e validar sua assinatura.
O que é problema é apenas a assinatura da conexão com o webservice.

Vejam se está correta a idéia:

(...)
	String nfeCabecMsg = cab.getCabecalho();
	String nfeDadosMsg = Comandos.getConteudoArquivo(Main.parametros.getArquivosXML() + "temp.xml");
		
        System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
        
        if (Main.parametros.getTipoCertificado() == ParametrosXML.A1) {
            Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());  
            
            System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");  
            System.setProperty("javax.net.ssl.keyStore",Main.parametros.getCertificadoCliente());  
            System.setProperty("javax.net.ssl.keyStorePassword", Main.parametros.getSenhaCliente());	
        } else {
        	Provider p = new sun.security.pkcs11.SunPKCS11(Main.parametros.getTokenCFG());
        	Security.addProvider(p);
        	
        	System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");
        	System.setProperty("javax.net.ssl.keyStore","NONE");
        	System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-SmartCard");
        	System.setProperty("javax.net.ssl.keyStorePassword", Main.parametros.getSenhaCliente());
        }  
  
        System.setProperty("javax.net.ssl.trustStoreType", "JKS");  
        System.setProperty("javax.net.ssl.trustStore", Main.parametros.getCertificadoServidor());
        System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
		
        NfeStatusServico service = new NfeStatusServicoLocator();  
        try {  
            NfeStatusServicoSoap nfeStatus = service.getNfeStatusServicoSoap();
            
            String resultado = nfeStatus.nfeStatusServicoNF(nfeCabecMsg, nfeDadosMsg); //Aqui ocorre o erro 403!

        } catch (Throwable e1) {  
        		if (Main.parametros.getDebug()) {
        			e1.printStackTrace();
        		}
        }

Ah. importante:
O token.cfg contém:
name = SmartCard
library = c:/windows/system32/aetpkss1.dll

O erro que ocorre é o Forbidden, o padrão dizendo que entrei sem certificado no site.
Alguém tem alguma luz? x}
[]'s

F

xsplyter:
Olá galera!
Procurei aqui no forum alguém com problema semelhantes, porém não encontrei nada parecido… hehe
Então como se trata de certificado A3 para NFe resolvi postar aqui um problema que tenho.



O erro que ocorre é o Forbidden, o padrão dizendo que entrei sem certificado no site.
Alguém tem alguma luz? x}
[]'s

Sim eu tive este problema, enquanto estava emitidindo pelo fisco estadual(Rondonia) estava tudo ok, porem como é de conhecimento geral, Rondonia nao aguentou o arroxo e agora esta trabalhando no SEFAZ VIRTAL RS - SVRS, e foi ai que um certificado A3 token do SERASA de um cliente nosso parou de funcionar, dando exatamente o forbidden na assinatura da conexao.

Resultado: não consegui resolver, adicionei tudo quanto é tipo de cadeia de certificado no trust do JKS mas sem sucesso.
Status atual: pra nossa sorte o cliente é muito amigo nosso, o cara tava sem emitir entao foi la no SERASA e comprou um A1 novinho, o token ainda esta la em casa, mas nao tive tempo de tentar resolver o problema!

X

hummm…
O mais hilário é que consigo acessar pelo internet explorer o mesmo endereço que tento acessar pelo java, porém pelo internet explorer acessa, e pelo java Forbidden.
Também tentei colocar no jks N certificados… que vieram junto com o CD e mais os que eu já tinha.
Também não deu certo!

X

A forma que vc usou para acessar o webservice está parecida com a minha?
Teve algum parâmetro a mais ou a menos?
[]'s

F

xsplyter:
A forma que vc usou para acessar o webservice está parecida com a minha?
Teve algum parâmetro a mais ou a menos?
[]'s

Sim a maneira é esta mesma, acho que nao tem nada a mais, estou sem o codigo agora.

Rapaz eu coloquei cadeia de certificado até dentro do token no gerenciador dele. La tem a opcao de importar certificados, ainda tenho minhas duvidas se nao é isto.

Sim o mais estranho é ele passar pelo IE/Firefox normalmente.

X

Tentei importar alguns certificados que achei coerentes, porém também não deu certo!
Que certificados vc importou?

F

xsplyter:
Tentei importar alguns certificados que achei coerentes, porém também não deu certo!
Que certificados vc importou?

Aquelas cadeias pb7 alguma coisa que tem no site da receita e no site do SVRS. Alem disto entrei diretamente no site do webservice e exportei pelo navegador no formato DER e tals, mesmo assim nao funfou, pode ser que passei pela resolucao e nao consegui, isto acontece muito quando vc esta de cabeça quente e tentando de varias maneiras diferentes.

X

Salve galera!
Seguinte… depois de tentar algumas coisas e falando com o pessoal da Certisign consegui resolver!

O que fiz foi adicionar esta hierarquia:
http://www.certisign.com.br/suporte/utilitarios-criptograficos/hierarquias-de-certificacao/icp-brasil/e-cnpj

Os certificados que estão na opção 2!
[]'s

F

xsplyter:
Salve galera!
Seguinte… depois de tentar algumas coisas e falando com o pessoal da Certisign consegui resolver!

O que fiz foi adicionar esta hierarquia:
http://www.certisign.com.br/suporte/utilitarios-criptograficos/hierarquias-de-certificacao/icp-brasil/e-cnpj

Os certificados que estão na opção 2!
[]'s

Adicionar onde xsplyter? No KeyStore.jks???

X

No próprio cartão ou token do certificado.

Usa aquele programa SafeSign, na opção de importar certificados.

[]'s

E

Pessoal, estou precisando achar algum identificador (serial) do cartão A3, porém a API Provider não me dá esse tipo de informação, apesar de ter conseguido “enxergá-la” via debug, me parece que não existem métodos públicos que permitam visualizar essa informação.

Estou precisando identificar o cartão, antes mesmo do usuário ou sistema (automáticamente) inserir esse PIN, pois após N tentativas o cartão é bloqueado.

Alguém aí conhece alguma API que me forneça essa informação ?

PS: Já contornamos a situação, porém me seria extremamente útil conseguir isso, pra automatizar o processo.

Abraços.

Edson.

X

hey fredferrao

Você conseguiu algo com seu token?
Eu estou com um problema igual ao que tive para o A3.

Porém consigo assinar a nota normalmente, e na hora que tento acessar um webservice qualquer dá erro de autenticação.
(para o cartão A3 funciona TUDO)
O fato de assinar a nota já elimina boa parte das possibilidades de erro, como provedor usado, senha errada, entre outros.

Pelo sistema do governo funciona normalmente, pois eles acessam os certificados do repositório do windows.
Além disso, no caso do token não foi necessário adicionar cadeias de certificados adicionais.

Alguém passou por esse problema também?

[]'s

G

Estou com o seguinte erro:

PKCS11 not found

token.cfg

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

minha classe:

Provider p = new sun.security.pkcs11.SunPKCS11("token.cfg");
Security.addProvider(p);
KeyStore ks = KeyStore.getInstance("PKCS11");
ks.load(null, senha.toCharArray());

O certificado que estou utilizando é um e-Cnpj (cartão)

Tentei seguir a dica do xsplyter e o erro é o mesmo.

Help me please!!!

G

Alterei o arquivo de configuração para usar outra dll

name = SafeSign
library =  C:/WINDOWS/system32/opensc-pkcs11.dll

A exception “PKCS11 not found” continua, mas agora gera a seguinte saída no console:

[b]
card-starcos.c:451:: returnning whith: invalid arguments
card.c:713:: returnning whith: invalid arguments

[/b]

A diferença é que agora com essa nova dll a leitora de cartão pisca o led quando rodo minha classe, mas o PKCS11 not found continua

C

galera… minha dúvida é mais em relação as ferramentas no Eclipse… o plugin do Axis2 mais especificamente.

tenho em mãos o cartão A3 e a leitora… já consegui criar e testar com sucesso minha aplicação java que assina
os xmls usando o certificado no cartão…

mas o meu problema é com esse plugin no eclipse:

o que ele faz é se conectar ao Web Service pegando o WSDL e montando toda a estrutura de classes em java pra acessa-lo e consumi-lo…

só que não estou achando a configuração do eclipse onde eu importo o certificado A3, aí o plugin não consegue se conectar ao
WSDL da receita, com certeza porque precisa do certificado…

alguma luz???

valeu, abraço

A

Bom dia pessoal,

Eu tenho um certificado A3, em dispositivo USB.
Mas nem sei por onde começar.

Utilizando certificados A1, (*.pfx) esta tudo blz, funcionando perfeitamente.

Mas agora eu preciso desenvolver assinatura utilizando o A3.
Preciso criar um arquivo token.cfg ? e configurar alguma coisa nele ?

R

boa noite prezados,

O certificado A3 para web como pode ser desenvolvido.

Exemplo tenho o servidor e o client side, no client que ele pluga o token na sua máquina ai leio o certificado, teria alguma opção de ler esse token no cliente e enviar as informações do certificado para o servidor?

Preciso disso pois será o servidor responsável por conectar com a prefeitura.

Valeu galera.

T

Não sei se vai ajudar, mas para assinatura na lógica só precisamos dos dados do certificado PublicKey e PrivateKey isso da pra extrair com outros programas daí cria um arquivo criptografado a sua maneira e daí ultiliza os dados quando bem entender.

Eu to envolvido bastante nessa coisa de NFe já valido, e assino só não consigo enviar a merda da nota. kkkk

Abraço

ps: se vc souber como enviar a nota em java somente o envio eu ia agradecer

espero ajudar

P

Tiago Neves

exemplo rápido e simples de consumação do webservice nfe.
Setei nfeCabecMsg e nfeDadosMsg apenas para testes.
Na linha System.out.println("Retorno webservice: " + call.invoke(param)); vc receberá o retorno da receita.

O exemplo abaixo apenas consulta o status do serviço p/ o estado de sp:

public class ClienteWebService {
	public static void main(String[] args) throws Exception {

		System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");
		Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

		System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
		System.setProperty("javax.net.ssl.keyStore","caminhoCert!");
		System.setProperty("javax.net.ssl.keyStorePassword", "senhaCert");

		System.setProperty("javax.net.ssl.trustStoreType", "JKS");
		System.setProperty("javax.net.ssl.trustStore","caminhoKeystore");

		// Endereço, local onde encontra-se o Web Service
		String local = &quot;https://nfe.fazenda.sp.gov.br/nfeweb/services/nfestatusservico.asmx&quot;;

		// Criando e configurando o serviço
		Call call = (Call) new Service().createCall();

		// Configurando o endereço.
		call.setTargetEndpointAddress(local);

		// Marcando o método a ser chamado.
		call.setOperationName(&quot;consultaServ&quot;);

		String nfeCabecMsg = &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot;?&gt;&lt;cabecMsg xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"1.02\"&gt;&lt;versaoDados&gt;1.07&lt;/versaoDados&gt;&lt;/cabecMsg&gt;&quot;;
		String nfeDadosMsg = &quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot;?&gt;&lt;consStatServ versao=\"1.07\" xmlns=\"http://www.portalfiscal.inf.br/nfe\"&gt;&lt;tpAmb&gt;1&lt;/tpAmb&gt;&lt;cUF&gt;42&lt;/cUF&gt;&lt;xServ&gt;STATUS&lt;/xServ&gt;&lt;/consStatServ&gt;";

		// Set Parâmetros de envio
		Object[] param = new Object[] { nfeCabecMsg, nfeDadosMsg };

		try {
			// Retorno
			System.out.println("Retorno webservice: " + call.invoke(param));
		} catch (RemoteException e) {
			// e.printStackTrace();
			System.out.println("Problemas ao conectar com webservice " + local
					+ "\n" + e.getMessage());
		}
	}
}

espero ter ajudado ^^

será que vc ou alguem consegue me ajudar com este problema aqui: [url]http://www.guj.com.br/posts/list/206895.java#1057324[/url] ???

C

Estou finalizando uma aplicação de NFe, gostaria de pedir a senha do cartao na inicialização do sistema para que o usuario possa logar, então pergunto: Como posso obter a senha do cartão para comparar com a senha digitada pelo usuário?

Agradeço desde já qualquer ajuda!

E

Carla, na verdade vc não pede a senha no cartão, vc pede pro usuário digitar na aplicação ou armazena isso em algum lugar e daí “passa” para o java validar no cartão:

System.setProperty(“javax.net.ssl.keyStorePassword”, “<aqui_vai_a_senha>”);

Se por acaso depois de inicializar o smartcard ele retornar uma exception, aí sim vc consegue capturar se o login foi inválido ou não (uma exception é lançada).

Att.
Edson.

L

Bom dia pessoal,

Estou com um problema no certificado A3 com token da rainbow.

Meu token.cfg etá assim:
name=Safenetikey2032
library=c:/windows/system32/dkck201.dll
Um pedaço do meu código está assim:
Provider p = new sun.security.pkcs11.SunPKCS11(getcertificadoFile());

	Security.addProvider(p);
	System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");

	System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");
	System.setProperty("javax.net.ssl.keyStore", "NONE");
	System.setProperty("javax.net.ssl.keyStorePassword", getcertificadoPassword());

	System.setProperty("javax.net.ssl.trustStoreType", "JKS");
	System.setProperty("javax.net.ssl.trustStore", CERTIFICADO_ARQUIVO_PR);
	System.setProperty("javax.net.ssl.trustStorePassword", CERTIFICADO_SENHA_PR);

	KeyStore ks = KeyStore.getInstance("PKCS11");
	ks.load(null, certificado.getcertificadoPassword().toCharArray());
	
    Enumeration<String> aliasesEnum = ks.aliases();
    while (aliasesEnum.hasMoreElements()) {  
        String alias = (String) aliasesEnum.nextElement();
	        
        System.out.println("<INICIO -------------------------------------------------------------------------------------------------");
        System.out.println("----> Certificado alias: " + alias + "    Key store type: " + ks.getType());
        X509Certificate certif = (X509Certificate)ks.getCertificate(alias);
        System.out.println( "SN =     " + certif.getSerialNumber().toString(16) );
        System.out.println( "Issuer = " + certif.getIssuerDN().toString() );
        System.out.println( "subject= " + certif.getSubjectDN().toString() );
        System.out.println("<FIM ----------------------------------------------------------------------------------------------------");
	}

No token existe a seguinte cadeia de chaves:
[color=blue]AC Raiz
AC Secretaria da refeita federal do brasil
AC Serasa RFB
Empresa com o certificado E-CNPJ
[/color]

Quando eu executo o programa o retorno é o seguinte:

[color=red] ----> Certificado alias: 2a12a8fb-d26c-45dd-acdf-4b2e94a8a185 Key store type: PKCS11
SN =5
Issuer =CN=Autoridade Certificadora Raiz Brasileira v1, OU=Instituto Nacional de Tecnologia da Informacao - ITI, O=ICP-Brasil, C=BR
subject=CN=AC Secretaria da Receita Federal do Brasil, O=ICP-Brasil, C=BR
[/color]

Ou seja não está me retornando o certificado da empresa com E-CNPJ e sim o segundo nível da raiz, neste caso AC Secretaria da REceita Federal do Brasil

Alguém já passou por isso ?

[color=darkred]Obs: No cartão tipo A3 está tudo certo o problema dá apenas no token.[/color]

Por gentileza, se alguém puder me ajudar eu agradeço.

Um abraço a todos.

L

Boa tarde,

Na minha aplicação quando faço a primeira assinatura de um xml com o Certificado A3 ele me pede a senha com um tela do proprio Token, apartir disso não me é solicitado mais a senha…

Gostaria de saber como resolver isso… alguma forma de executar a assinatura do xml sem solicitar ao usuario a senha.

Pude perceber também que é nessa linha “signature.sign(dsc);” que apresenta a tela de digitação da senha:

Reference ref = fac.newReference(uri, fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null);
		System.out.print(" 444444");
		SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null) ,fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref) );
		System.out.print(" 55555");
		XMLSignature signature = fac.newXMLSignature(si, ki);
		System.out.print(" 66666");
		DOMSignContext dsc = new DOMSignContext(privateKey, doc.getElementsByTagName("NFe").item(0));
		System.out.print(" 7777777");
		signature.sign(dsc);
		System.out.print(" 88888888");

Desde já Obrigado…
Miguel

P

eu faço assim:

while (aliasEnum.hasMoreElements()) {
String aliasKey = (String) aliasEnum.nextElement();
System.out.println(aliasKey);
System.out.println(ks.getCertificate(aliasKey));
}

ué, mas o certo não é pedi td vez p/ inserir a senha???rsrs

L

Eu gostaria de que o usuario não tivesse que digitar a senha… ela seria passada como parâmetro…

J

acmedis:
Bom dia pessoal,

Eu tenho um certificado A3, em dispositivo USB.
Mas nem sei por onde começar.

Utilizando certificados A1, (*.pfx) esta tudo blz, funcionando perfeitamente.

Mas agora eu preciso desenvolver assinatura utilizando o A3.
Preciso criar um arquivo token.cfg ? e configurar alguma coisa nele ?

Estou na mesmíssima situação, se alguém puder me dar umas dicas agradeço.

Aproveito para perguntar: meu cliente comprou o certificado A3 e está com ele agora, só que ele está muito longe, tem jeito de ele me enviar o conteúdo do dispositivo USB para eu fazer os testes aqui e depois instalar na maquina dele?

P

Sem o token e o cartão você não tem como testar!
Apenas se for A1.

J

[color=brown]Ninguém teria um exemplo de como enviar o XML? (já está validado e assinado)[/color]

P

web service?

J

Sim, estou trabalhando com a versão 2.

Preciso saber como pego o XML e faço e envio.

P
import java.net.URL;

import javax.swing.JOptionPane;

import javax.xml.namespace.QName;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

public class Conexao implements Runnable {

private String url;
private String nameSpace;
private String metodo;
private String xml;
private String parametro;



public void setMetodo(String metodo) {
    this.metodo = metodo;
}

public void setNameSpace(String nameSpace) {
    this.nameSpace = nameSpace;
}

public void setParametro(String parametro) {
    this.parametro = parametro;
}

public void setXml(String xml) {
    this.xml = xml;
}

public void setURL(String url) {
    this.url = url;
}

public void run() {

    String result = null;
    try {
        URL endpoint = new URL(url);
        Service service = null;
        try {
            service = new Service();
        } catch (NoClassDefFoundError e) {
            e.printStackTrace();
        }
        Call chamada = (Call) service.createCall();
        chamada.setTimeout(0);
        chamada.setTargetEndpointAddress(endpoint);
        chamada.setOperationName(new QName(nameSpace, metodo));
        chamada.addParameter(parametro, org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
        chamada.setReturnType(org.apache.axis.Constants.XSD_STRING);
        result = (String) chamada.invoke(new Object[]{xml});   //Retorna na string result o retorno do seu webservice.
        System.out.println(result);   

        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

//Pra usar a classe você seta os valores e roda a thread :smiley:

Conexao conect = new Conexao();
        conect.setMetodo("AQUI_VAI_O_NOME_DO_SEU_METODO");
        conect.setNameSpace("AQUI_VAI_SEU_NAMESPACE");
        conect.setParametro("AQUI_VAI_O_NOME_DO_PARAMETRO");
        conect.setURL("AQUI_VAI_SEU_URL");
        conect.setXml("AQUI_VAI_O_SEU_XML");
        Thread conexao = new Thread(conect);
        conexao.start();

Não sei se era isso que você queria, se foi espero ter ajudado.
Qualquer coisa posta ai de novo.

J

Na verdade eu queria saber como enviar com as classes geradas dos WSDL.

Eu até uso Axis, mas o Axis2, é diferente, mas eu não tenho experiência nenhuma com ele.

De qualquer forma valeu pela ajuda.

D
Como passei pelo problema de todo mundo aqui vou deixar algumas dicas para fazer a integração do NFe com certificados A3. Primeiro passo.. montar o ambiente, no caso estou usando Spring 3, Apache CXF e Maven2... O danado do POM:
<properties>
    <spring-version>3.0.3.RELEASE</spring-version>
    <cxf-version>2.2.10</cxf-version>
</properties>    

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>                    
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
    </plugins>                        
</build>

<dependencies>
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>inject-api</artifactId>
        <version>1.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring-version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring-version}</version>
    </dependency>        
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring-version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>${cxf-version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>${cxf-version}</version>
    </dependency>
</dependencies>
Segundo passo: Configurar o Spring
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"	
	xmlns:beans="http://www.springframework.org/schema/beans" 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:sec="http://cxf.apache.org/configuration/security" 
	xmlns:http="http://cxf.apache.org/transports/http/configuration"
	xmlns:soap="http://cxf.apache.org/bindings/soap"	
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://cxf.apache.org/configuration/security http://cxf.apache.org/schemas/configuration/security.xsd
    	http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
        http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd        
        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

	<import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

	<http:conduit name="https://nfe.sefaz.go.gov.br/OServico">
		<http:tlsClientParameters>	    
		    <sec:keyManagers keyPassword="***">
	      		<sec:keyStore type="PKCS11" password="***" provider="SunPKCS11-SmartCard" resource="p11.conf"/> 		
	      	</sec:keyManagers>
	      	<sec:trustManagers>				
				<sec:keyStore type="JKS" password="***" resource="myJks.jks"/>
			</sec:trustManagers>
		</http:tlsClientParameters>		
   	</http:conduit>
	
	<jaxws:client id="servico" 
		address="https://nfe.sefaz.go.gov.br/OServico" 
		serviceClass="br.com.teste.OServico">
		<jaxws:binding>
			<soap:soapBinding version="1.2"/>
		</jaxws:binding>		
	</jaxws:client>
   	
</beans>
Terceiro passo: O arquivo p11 Esse arquivo serve para apontar para a dll do fabricante do leitor O name deve bater com o name do spring definido no provider do keystore "SunPKCS11-name"
name=SmartCard
library=C:/WINDOWS/system32/aetpkss1.dll
Quarto passo: A classe main
package br.com.datatraffic.sefazgo;

import java.security.Security;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import sun.security.pkcs11.SunPKCS11;

public class Main {

	public static void main(String[] args) throws Exception {
		Security.addProvider(
			new SunPKCS11(Thread.currentThread().getContextClassLoader().getResourceAsStream("p11.conf"))
		);
		BeanFactory factory = new ClassPathXmlApplicationContext("spring-config.xml");
		OServico servico = (OServico) factory.getBean("servico");
		String resultado = servico.facaAlgo("Teste");
		System.out.println(resultado);
	}

}

É isso aí.. mais simples impossível

M

rickasmbh:
boa noite prezados,

O certificado A3 para web como pode ser desenvolvido.

Exemplo tenho o servidor e o client side, no client que ele pluga o token na sua máquina ai leio o certificado, teria alguma opção de ler esse token no cliente e enviar as informações do certificado para o servidor?

Preciso disso pois será o servidor responsável por conectar com a prefeitura.

Valeu galera.

Estou nessa mesma situação. Como assinar um XML estando o mesmo no servidor e o certificado digital no cliente?

Alguém tem uma solução?

R

mvrochabh:
rickasmbh:
boa noite prezados,

O certificado A3 para web como pode ser desenvolvido.

Exemplo tenho o servidor e o client side, no client que ele pluga o token na sua máquina ai leio o certificado, teria alguma opção de ler esse token no cliente e enviar as informações do certificado para o servidor?

Preciso disso pois será o servidor responsável por conectar com a prefeitura.

Valeu galera.

Estou nessa mesma situação. Como assinar um XML estando o mesmo no servidor e o certificado digital no cliente?

Alguém tem uma solução?

E ai alguem conseguiu utilizar o certificado do tipo A3 na WEB? Eu pensei em usar um Applet mas não sei se vai dar certo.

P

rafaelbtz:
mvrochabh:
rickasmbh:
boa noite prezados,

O certificado A3 para web como pode ser desenvolvido.

Exemplo tenho o servidor e o client side, no client que ele pluga o token na sua máquina ai leio o certificado, teria alguma opção de ler esse token no cliente e enviar as informações do certificado para o servidor?

Preciso disso pois será o servidor responsável por conectar com a prefeitura.

Valeu galera.

Estou nessa mesma situação. Como assinar um XML estando o mesmo no servidor e o certificado digital no cliente?

Alguém tem uma solução?

E ai alguem conseguiu utilizar o certificado do tipo A3 na WEB? Eu pensei em usar um Applet mas não sei se vai dar certo.

o diogo.soares postou uma solução alguns posts acima do seu, vc viu ?

att,

R

pedruhenrik:
rafaelbtz:
mvrochabh:
rickasmbh:
boa noite prezados,

O certificado A3 para web como pode ser desenvolvido.

Exemplo tenho o servidor e o client side, no client que ele pluga o token na sua máquina ai leio o certificado, teria alguma opção de ler esse token no cliente e enviar as informações do certificado para o servidor?

Preciso disso pois será o servidor responsável por conectar com a prefeitura.

Valeu galera.

Estou nessa mesma situação. Como assinar um XML estando o mesmo no servidor e o certificado digital no cliente?

Alguém tem uma solução?

E ai alguem conseguiu utilizar o certificado do tipo A3 na WEB? Eu pensei em usar um Applet mas não sei se vai dar certo.

o diogo.soares postou uma solução alguns posts acima do seu, vc viu ?

att,

Vi sim, mas ali ele usa Spring e tem até um teste com classe Main e tal.

Aqui meu aplicativo é muito simples é feito em JSF e tem uma unica pagina pra fazer upload de arquivo TXT, o sistema converte em XML assina e faz todo o processo de envio, já está funcionando perfeitamente com A1, agora surgiu esse requisito de fazer funcionar com A3 e ai está minha dúvida como fazer o cliente informar os dados do certificado via browser para que eu consuma o WebService no servidor.

Eu pensei em Applet inclusive utilizei pra testes um código seu, onde vc pega a lista de certificados instalados no Windows, meu problema é que eu não posso serializar o KeyStore para enviá-lo ao servidor para este utilizar na assinatura e no consumo do WebService.

Ou seja existe algum jeito do usuário informar os dados do certificado (nesse caso A3 Card) no Browser para ser utilizado no servidor?

H

Também estou com uma dúvida similar. Tenho aqui um sistema web, e preciso implementar a assinatura via certificado A3.

Daí vem, então, o seguinte problema: o cartão está na máquina cliente, e o sistema está rodando no servidor. Não é viável manter o certificado A3 no servidor, nem possível transmitir o certificado do cliente para o servidor, pois, por definição, todo o processo de encriptação/assinatura do A3 é efetuado pelo microcontrolador dentro do smartcard, ou seja, a chave privada nunca sai do cartão.

Tendo isto em vista, tanto o processo de assinatura quanto a comunicação com o webservice precisariam ser efetuados na máquina cliente.

Alguém tem alguma idéia de qual seria a melhor maneira de implementar isto?

– editado –

O artigo em http://www.developer.com/security/print.php/11580_3587361_2 ensina como criar um applet para assinar arquivos locais via smartcard e enviá-los ao servidor. Ao que tudo indica, esta solução poderia ser adaptada para assinar uma NFe via web.

Z

Alguem poderia postar um exemplo de geração e envio do xml usando o certificado a3?

Estou precisando muito desse exemplo.

Obrigado pela atenção.

Abraços

P

http://www.guj.com.br/java/237281-tutorial-consumir-webservice-nfe-20

talvez ajude

att

Criado 21 de novembro de 2008
Ultima resposta 13 de mai. de 2013
Respostas 60
Participantes 27