Página 3 de 4
Novo projeto
Enviado: 30 Jul 2015 00:08
por fladimir
Testei em uma outra maquina sem o ACBr funcionou
Desativei (fechei o programa) do ACBr da minha maquina q estava testando e refiz os testes e funcinou.
Agora a diferença é q 1 é 32 e outra 64
A 32 é XP e a 64 Windows 7
Acredito q não seja o ACBr pq mesmo desativado da o problema
Creio q esteja mais pra SO, agora novamente o q? Versoes Dlls especificas? Se sim pq o ACBr funciona, não teria q o projeto tb funcionar?
Novo projeto
Enviado: 30 Jul 2015 08:37
por JoséQuintas
Porque ACBR funciona?
Talvez ele acesse as DLLs por 64 bits, e justamente por elas entrarem como 64 bits não funcionem em 32 bits.
E se for isso, resta saber se pelo ACBR vai funcionar por 32 bits.
Então na máquina 64 bits, deixar as DLLs apenas como 32 bits, o que na verdade elas são.
Detalhe: a DLL tem que estar acessível também pra "des-registrar, e tem que usar o regsvr32.exe correto.
Código: Selecionar todos
cd \Windows\system32
regsvr32 /u capicom.dll
regsvr32 /u msxml5.dll
cd \Windows\syswow64
regsvr32 /u capicom.dll
regsvr32 /u msxml5.dll
regsvr32 capicom.dll
regsvr32 msxml5.dll
Só pra lembrar:
não tem a ver com as pastas aonde estão as dlls, e sim com o regsvr32.exe. Não existe regsvr64.exe, mas existem 2 regsvr32.exe.
\Windows\system32\regsvr32.exe
\Windows\syswow64\regsvr32.exe
A pasta \Windows\system32 não é 32 bits, é apenas um nome default, portanto em 64 bits tem componentes 64 bits
A pasta \Windows\syswow64 não é 64 bits, tem componentes 32 bits
Novo projeto
Enviado: 30 Jul 2015 12:08
por JoséQuintas
Encontrei sobre abrir o repositório de certificados como somente leitura, ou leitura/gravação.
Por enquanto só imagino duas hipóteses:
- O que mencionei de carregar como 64 bits impedir carregar como 32 bits
- Uma abertura por parte do ACBR como modo não compartilhado, deixando o acesso pelo ACBR sempre instantâneo, mas impedindo o uso por outro aplicativo
Inclusive, por via das dúvidas, alterei a seleção do certificado pra usar modo somente leitura.
Seria um ponto a observar nos fontes do ACBR, se ele faz isso também. Poderia ser um motivo de bloqueio (considerando bloqueio como hipótese).
Novo projeto
Enviado: 30 Jul 2015 12:21
por fladimir
Descobri!!!!
Funcionou!!!!
Eu tinha na minha maquina W7 64 2 certificados de mesmo nome instalados, porém de validades diferentes 1 era do ano passado e outro desse ano.
Ai o ACBr consegue distinguir mas o projeto não, talvez pq pegue pelo nome o certificado não sei.
Na maquina virtual 1 funcionou pq não tinha certificado e eu instalei somente o valido (vencimento 2016) ai funcionou.
Pra tirar a prova fui na outra maquina virtual XP 32 bits q não tinha funcionado tb e fui ver tinha 2 certificados instalados, mesmo eu escolhendo o CERTIFICADO CORRETO não funciona, tem q excluir o certificado velho pra funcionar.
Podiamos ver isso no projeto se tem como fazer ficar igual ao ACBr, ou seja, se escolhi o correto independente de ter outro VENCIDO de mesmo nome ir pelo q eu escolhi q não esta vencido.
Legal, agora vou dar continuidade.
Obrigado pela força José
Novo projeto
Enviado: 30 Jul 2015 12:35
por JoséQuintas
Encontrei isto:
http://balaiotecnologico.blogspot.com.b ... re-do.html
que chamou a atenção nesta parte:
A função Close do Store tem que ser chamada quando não for mais usar o Store ou se for necessário reabrí-lo para acessar outro conjunto de certificados.
Não sei se isso se restringe ao aplicativo.
Inclusive eu também não estava fazendo isso, o close().
Isso não altera o problema em questão, mas pode evitar algum.
Novo projeto
Enviado: 30 Jul 2015 12:54
por fladimir
vou dar continuidade aki na migração de ACBr para o projeto novo do hbNFe e depois q terminar volto a testar isso pq tenho o outro certificado velho ai instalo e ele e já q sabemos onde é o problema tentamos resolver pra ficar mais redondinha a classe.
Agora se vc tiver um certificado de mesmo nome vencido ai já pode ir vendo caso queira.
Vlw José, qualquer coisa posto aki novamente.
[]´s
Novo projeto
Enviado: 30 Jul 2015 14:01
por JoséQuintas
Rotina CapicomCertificado() é a que pega o certificado.
Incluir lá a checagem de validade.
Na atual pega o primeiro que encontrar com mesmo nome, sem verificar validade.
Novo projeto
Enviado: 30 Jul 2015 14:19
por JoséQuintas
OK, inclui um IF na rotina.
Código: Selecionar todos
IF oColecao:Item( nCont ):ValidToDate >= Date()
oCertificado := oColecao:Item( nCont )
ENDIF
E um alerta, pelo menos na assinatura
Código: Selecionar todos
oCert:= CapicomCertificado( cCertCn )
IF oCert == NIL
cRetorno := "Erro Assinatura: Certificado não encontrado ou vencido"
RETURN cRetorno
ENDIF
É só uma ajuda.
No webservice é passado o nome, e a seleção é fora da classe.
Não sei como o ACBR teria controle nisso.
Novo projeto
Enviado: 30 Jul 2015 15:07
por fladimir
Legal vou testar
Novo projeto
Enviado: 30 Jul 2015 17:27
por fladimir
Coloquei as alterações e testei mas se deixo 1 certificado vencido e 1 válido (não vencido) não funciona.
O ACBrNFeMonitor qdo escolhemos o certificado ele mostra o Serial.
Será q não tem como setar o certificado pelo Serial ao invés do Nome?
Outro detalhe q achei estranho, no Método MicrosoftXMLSoapPost na linha
Código: Selecionar todos
oServer:setOption( 3, "CURRENT_USER\MY\" + ::cCertificado )
a propriedade ::cCertificado esta VAZIA = ""
nem sei se tem a ver, somente me chamou a atenção.
Tentei forçar a passagem de algum conteúdo seja, Serial ou Nome do certificado mas o erro permanece, ou seja, ::cCertificado pode ter conteúdo ou não q aparentemente não faz diferença
Se se deixo instalados os 2 certificados continua o erro, se removo o vencido funciona e em qualquer 1 dos testes (com certificado vencido ou não) fica VAZIO a propriedade ::cCertificado na linha em questão
Mas acho q temos q mudar algo antes só não sei o q ainda, estou pesquisando.
Mas acho SUPER importante corrigir isto pq no dia a dia em campo na carteira de cliente os clientes vão atualizando seus certificados e vão ter na maquina certificados VENCIDOS e VALIDOS e isto pode dar problema como verifiquei, só fico com uma dúvida, tem colegas q usam esta classe a mais de anos será q não tiveram os mesmos problemas nos clientes deles em campo?
Pq depois q identifiquei o problema e removi o certificado vencido a classe original do hbNFe tb esta funcionando o exemplo de testes q eu havia comentado q tb estava tendo problemas em outros tópicos.
Novo projeto
Enviado: 30 Jul 2015 20:29
por JoséQuintas
Com a alteração que fiz, ao selecionar certificado vencido ele não é aceito, por isso o nome fica em branco.
Ainda não encontrei solução.
Fica a cargo do usuário excluir certificados vencidos, o que ocorre uma vez por ano.
Uma rotina pode ser usada pra avisar sobre certificados vencidos a serem excluídos.
A própria seleção de certificados serve como base.
Aliás... quem instalar um certificado novo já pode aproveitar e excluir os antigos, é isso que costumo fazer.
Talvez alguém que conheça Delphi consiga decifrar o enigma olhando os fontes do ACBR.
Por enquanto removi a alteração, e fixei o xmlhttp pra 6.0, pra ver se faz diferença.
Novo projeto
Enviado: 30 Jul 2015 20:45
por JoséQuintas
Achei algo.
https://msdn.microsoft.com/en-us/librar ... s.85).aspx
Retrieves the name of the certificate store that this object represents.
CAPICOM 2.0.0.3 and earlier: The Name property is not supported.
Agora falta encontrar documentação pra esse recurso.
A partir daí, ao invés de indicar o CN, seria indicar diretamente o nome.
Novo projeto
Enviado: 30 Jul 2015 21:20
por JoséQuintas
Nada feito.
Caso abra o repositório "My", o novo recurso vai retornar "My".
deve servir pra alguma coisa... sei lá... talvez pra fazer o caminho inverso de onde veio...
Novo projeto
Enviado: 30 Jul 2015 21:28
por JoséQuintas
Até abri a capicom no VB6, pra ver tudo que tem disponível, mas nada que ajude.
Novo projeto
Enviado: 30 Jul 2015 21:50
por fladimir
Blz José, obrigado, já valeu a nível de conhecimento e pelo menos agora posso tocar o barco.
Fora isso pegando tua sugestão poderia ser feito algo a nível de uma rotina q pegasse os certificados instalados e repassasse 1 a 1 e os vencidos perguntar se exclui ou algo do tipo, porém essa questão de excluir o certificado (REMOVER) via programação teria q pesquisar, mas isso é assunto pra outra hora.
No mais vamos continuar.
[]´s