Ir para conteúdo
  • Cadastre-se

dev botao

Erro ao carregar Digest: sha1 esporádico e na primeira tentativa de emissão


Ver Solução Respondido por Próton Sistemas,
  • Este tópico foi criado há 899 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

A aplicação costuma subir essa exceção no método abaixo:

{ Método clonado de ACBrEAD }
function TDFeOpenSSL.CalcHash(const AStream: TStream; const Digest: TSSLDgst;
  const Assina: Boolean): AnsiString;

Ainda não consegui determinar um padrão, mas me parece que é sempre na primeira tentativa de emitir alguma NFCe (ou consulta) e não são todas as vezes que inicializa a aplicação. Isso acontece tanto em ambiente de produção, quanto de qualidade/testes (eu logo todos os erros). A aplicação se recupera normalmente do problema, mas me incomoda não saber a causa além da qualidade de sujeira que isso gera no log da aplicação.

As dlls ficam na pasta da aplicação (openSSL e cia) e tudo funciona normalmente depois. O tópico é só para saber se alguém passa por isso e se conseguiu resolver. Imagino que na prática isso pode tá levando a minha aplicação a fazer emissões em contingência sem necessidade ou mesmo gerando outros problemas indiretamente.

saudações,

Rafael

  • Moderadores
Postado
10 horas atrás, ProtonSistemas disse:

A aplicação costuma subir essa exceção no método abaixo:

{ Método clonado de ACBrEAD }
function TDFeOpenSSL.CalcHash(const AStream: TStream; const Digest: TSSLDgst;
  const Assina: Boolean): AnsiString;

Ainda não consegui determinar um padrão, mas me parece que é sempre na primeira tentativa de emitir alguma NFCe (ou consulta) e não são todas as vezes que inicializa a aplicação. Isso acontece tanto em ambiente de produção, quanto de qualidade/testes (eu logo todos os erros). A aplicação se recupera normalmente do problema, mas me incomoda não saber a causa além da qualidade de sujeira que isso gera no log da aplicação.

As dlls ficam na pasta da aplicação (openSSL e cia) e tudo funciona normalmente depois. O tópico é só para saber se alguém passa por isso e se conseguiu resolver. Imagino que na prática isso pode tá levando a minha aplicação a fazer emissões em contingência sem necessidade ou mesmo gerando outros problemas indiretamente.

saudações,

Rafael

Uma dúvida. tentou pegar o exemplo do svn e configurar igual e emitir com ele para verificar se ocorre?

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

  • Membros Pro
Postado

Pelo que analisei rapidamente o problema é que minha aplicação usa o ACBr na thread principal e em outra thread. Se os dois chamarem esse método simultaneamente ocorre o problema a primeira vez. Acredito que a biblioteca openSSL ainda não tenha carregado. Coloquei um delay na thread para só começar depois que a principal inicializar. Depois disso, parou de ocorrer o problema.

Rafael.

  • Moderadores
Postado
9 minutos atrás, ProtonSistemas disse:

Pelo que analisei rapidamente o problema é que minha aplicação usa o ACBr na thread principal e em outra thread. Se os dois chamarem esse método simultaneamente ocorre o problema a primeira vez. Acredito que a biblioteca openSSL ainda não tenha carregado. Coloquei um delay na thread para só começar depois que a principal inicializar. Depois disso, parou de ocorrer o problema.

Rafael.

há sim. verdade pois vão tentar acessar o certificado e o arquivo pfx será o mesmo.

obrigador por compartilhar conosco a solução

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

  • Membros Pro
Postado

Não me parece que o problema é o acesso ao certificado digital. Na primeira tentativa de uso do openSSL o sistema ainda vai carregar as DLLs. Depois de carregadas o sistema testa a variável abaixo:

    md := EVP_get_digestbyname( NameDgst );
    if md = Nil then
      raise EACBrDFeException.Create('Erro ao carregar Digest: '+NameDgst);

Neste caso eu só fiz garantir que na PRIMEIRA vez uma só thread execute até o final para finalizar o carregamento do openSSL (das DLLs). Depois disso, elas podem concorrer a vontade que não verifiquei problemas.

Rafael.

  • Moderadores
Postado
1 hora atrás, ProtonSistemas disse:

Não me parece que o problema é o acesso ao certificado digital. Na primeira tentativa de uso do openSSL o sistema ainda vai carregar as DLLs. Depois de carregadas o sistema testa a variável abaixo:

    md := EVP_get_digestbyname( NameDgst );
    if md = Nil then
      raise EACBrDFeException.Create('Erro ao carregar Digest: '+NameDgst);

Neste caso eu só fiz garantir que na PRIMEIRA vez uma só thread execute até o final para finalizar o carregamento do openSSL (das DLLs). Depois disso, elas podem concorrer a vontade que não verifiquei problemas.

Rafael.

então olha se no ACBr no instalador não tá marcado para fazer carga tardia das dll´s

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

  • Membros Pro
  • Solution
Postado

Exatamente, estou fazendo carregamento tardio. Provavelmente, vou deixar dessa forma pois só verifiquei esse problema de concorrência entre as threads. No mais, tudo funcionando depois dessa sincronizada na primeira operação.

Rafael.

  • Administradores
Postado

Tópico movido para a área do SAC, para que o SLA de respostas seja considerado

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.