Ir para conteúdo
  • Cadastre-se

ACBrLibNFSe MT: possível problema na troca de certificado durante sincronização de NFS-e Tomadas


Ver Solução Respondido por beatriz-n,

Recommended Posts

Postado

Olá, pessoal.

Estou enfrentando um comportamento que aparenta ser um problema na ACBrLibNFSe MT relacionado à troca de certificados digitais em tempo de execução.

Cenário

Minha aplicação possui um BackgroundService responsável por sincronizar as NFS-e Tomadas de diversas empresas.

Cada empresa possui seu próprio certificado digital. Durante a execução, o serviço percorre todas as empresas e, para cada uma delas:

  • Obtém o certificado correspondente;

  • Configura a ACBrLib com esse certificado;

  • Realiza a consulta das NFS-e Tomadas utilizando o CNPJ da empresa.

Como o processamento ocorre sequencialmente para várias empresas, a biblioteca precisa trocar de certificado entre uma consulta e outra.

Problema observado

A aplicação consegue recuperar corretamente o certificado de cada empresa. Inclusive, antes da consulta, consigo validar que o certificado carregado é o esperado utilizando o método ObterCertificado().

Entretanto, durante a consulta, a ACBrLib continua utilizando o certificado da empresa processada anteriormente.

Como consequência:

  • a consulta é enviada utilizando um certificado diferente do CNPJ informado;

  • os XMLs de retorno e os erros indicam que a autenticação foi realizada com o certificado anterior;

  • o comportamento ocorre justamente quando há troca de empresa durante a sincronização.

Pela análise realizada, o problema não parece estar na recuperação do certificado pela aplicação, mas sim no momento em que a ACBrLib MT deveria substituir o certificado utilizado internamente.

Comportamento observado durante o debug

Durante os testes encontrei um comportamento que reforçou essa suspeita.

Coloquei um breakpoint no método ObterCertificado(). Após confirmar que o certificado retornado era o esperado, permaneci aproximadamente um minuto analisando o retorno da biblioteca e o log em nível paranoico antes de continuar a execução.

Ao prosseguir para o método de consulta, a ACBrLibNFe passou a utilizar o certificado correto da empresa processada naquele loop, sem qualquer alteração de thread, handle, recriação da instância da biblioteca ou utilização dos métodos Inicializar() e Finalizar().

Ou seja, apenas o fato de a execução permanecer pausada por cerca de um minuto fez com que a consulta fosse assinada com o certificado correto. Quando a aplicação executa normalmente, sem essa pausa, a consulta é assinada utilizando o certificado da empresa anterior.

Esse comportamento me leva a suspeitar de algum problema de sincronização, atualização interna ou troca efetiva do certificado dentro da ACBrLibNFe MT, já que a única variável alterada foi o tempo entre a configuração do certificado e a execução da consulta.

Gostaria de saber se esse comportamento é conhecido, se existe alguma etapa adicional necessária para garantir a troca efetiva do certificado ou se realmente pode se tratar de um problema na implementação da ACBrLibNFe MT.

Gostaria que não descartassem a possibilidade de um problema na Lib. Conversei com meu superior que implementou a mesma funcionalidade mas com ACBrLibNFe MT e ele constatou que não precisou fazer nenhuma reconstrução da instancia ACBrLib ou utilização de métodos de Inicializar() e Finalizar().

Caso seja necessário, posso fornecer logs em nível paranoico e um exemplo reproduzindo o problema.

Estou utilizando a configuração em memoria [Memory]

Postado

com wincrypt esta funcionando normalmente, com wincrypt não existe esse comportamento extranho. Sabendo disso troquei minha dll openssl para a versao 3 mas o comportamento ainda persiste, gostaria de utilizar openssl por conta da padronizacao dos bases do meu projeto, caso alguem tenha alguma sugestao de como resolver esse problema ficarei agradecida em saber

  • Solution
Postado

boa tarde,  não há nada de errado com a ACBrLib, pessoal que esta usando ACBrLibNFSe com C# que vai fazer esse tipo de sincronização, resolvi adicionando um escopo para cada empresa

exemplo:

 private readonly IServiceScopeFactory _scopeFactory;

                    foreach (var config in empresas)
                    {
                        try
                        {
                            using var scopeEmpresa = _scopeFactory.CreateScope();

                            var sync = scopeEmpresa.ServiceProvider.GetRequiredService<INfseAppService>();

                            await sync.SincronizarEmpresa(config.EmpresaId!.Value, config.ContaId!.Value);
                        }
                        catch (Exception ex)
                        {
                            _logger.LogError(ex, "Erro ao sincronizar empresa {EmpresaId}", config.EmpresaId);
                        }
                    }

meu metodo de consulta não fiz nada demais

 

     DfeLib.LimparLista();
     await ConfigurarComponente(config.EmpresaId!.Value, config.ContaId!.Value);

     DfeLib.Config.CodigoMunicipio = DfeConfig!.Cidade!.CodigoIbgeCidade;
     DfeLib.Config.Emitente.CNPJ = Certificado!.CnpjCpf!;
  
     var respostaConsulta = DfeLib.ConsultarDFe(nsuAtual);
 

  • Consultores
Postado

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
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 !!

Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.

The popup will be closed in 10 segundos...