Samuel-Oliveira / Java_Certificado

Projeto Java de Gerenciamento de Certificado Digital
MIT License
120 stars 75 forks source link

Dúvida com multiplos certificados (eCPF e eCNPJ) (reopen) #13

Closed carlosspohr closed 1 year ago

carlosspohr commented 2 years ago

Olá Samuel.

Dei uma olhada na issue #4, que já foi finalizada, e estamos com um problema parecido aqui, porém não sei se é aplicável a solução que você colocou no neste artigo.

Nós temos uma funcionalidade de assinatura de diplomas digitais com certificado A3, e alguns usuários podem ter dois certificados no PC (eCPF e eCNPJ), como por exemplo um diretor de faculdade.

Basicamente o erro acontece quando:

O usuário escolhe o seu eCPF, informa a senha e a sua biblioteca retorna o certificado corretamente. Na sequência, o usuário escolhe o seu eCNPJ, informa a senha desse certificado (é diferente da do eCPF) e a sua biblioteca retorna o eCPF (da primeira autenticação). Ao reiniciar o processo Java, escolher na primeira vez o certificado eCNPJ, ele funciona, porém se ele escolher o eCPF ...vai sempre retornar o eCNPJ.

No artigo que você fez, tem um parâmetro chamado "serial" que você usa para diferenciar cada certificado. A minha dúvida aqui é com o valor desse parâmetro...ele é obtido de algum lugar ou pode ser aleatório?

Samuel-Oliveira commented 2 years ago

Blz Carlos? O Serial é o identificado do TOKEN. Qnd existem conflitos de A3. è a unica forma de se capturar o token correto.

A forma de se pegar o seria pelo gerenciador de Tokens, que é instalado junto do A3 na máquina. Lembrando que esse serial, está ligado ao dispositivo que o A3 foi instalado, e não ao A3 em si.

E como dica geral: Remova o A3 da lista de Certificados aceitos pelo seu sistema; A dor de cabeça dele não vale.

carlosspohr commented 2 years ago

Oi Samuel, boa tarde. Muito obrigado pelo seu retorno.

Estou dando uma olhada no código que foi implementado pelo time, e esse é o ponto que está gerando o problema:

// vem de um combo gerado a partir do CertificadoService.listaCertificadosWindows()
String aliasCertificado = ...; 
// vem da configuração do usuário.
TipoCertificadoA3 tipoCertificado = TipoCertificadoA3.valueOf(config.getDriverLeitoraCartao()); // retorna OBERTHUR

String marcaA3 = tipoCertificado.getMarca();
String dllA3 = tipoCertificado.getDll();

// aqui autentica o certificado incorreto (ex: o eCPF ao invés do eCNPJ).
Certificado certificado = CertificadoService.certificadoA3(marcaA3, dllA3, inputPassword, aliasCertificado ); 

keyStore = CertificadoService.getKeyStore(certificado);

De fato na listagem dos certificados do windows, vem vários e vou adicionar um filtro para pegar apenas os que são do tipo que o usuário está configurado. Vou esperar o pessoal do administrativo me trazer os certificados para validar isso aqui e te dou um retorno aqui.

evertoschneider commented 2 years ago

Blz Carlos? O Serial é o identificado do TOKEN. Qnd existem conflitos de A3. è a unica forma de se capturar o token correto.

A forma de se pegar o seria pelo gerenciador de Tokens, que é instalado junto do A3 na máquina. Lembrando que esse serial, está ligado ao dispositivo que o A3 foi instalado, e não ao A3 em si.

E como dica geral: Remova o A3 da lista de Certificados aceitos pelo seu sistema; A dor de cabeça dele não vale.

Olá, Samuel.

Ao tentarmos realizar uma assinatura passando o token disponibilizado pelo gerenciador de tokens instalado na máquina, o seguinte erro é retornado na método br.com.swconsultoria.certificado.CertificadoService.getSlot(String, String): br.com.swconsultoria.certificado.exception.CertificadoException: Erro ao carregar informações do certificado:Erro Ao pegar SlotA3: CKR_TOKEN_NOT_PRESENT

Eu gostaria de saber se você tem uma idéia do motivo de este erro estar acontecendo.