Ir para conteúdo
  • Cadastre-se

dev botao

Erro no Suporte a Canais Seguros a Partir da Segunda Requisicao


marcianobandeira
  • Este tópico foi criado há 3362 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Olá Pessoal

Me deparei com um erro muito estranho agora, atualizei o sistema para trunk 2 e estou atualizando nos clientes, e me deparei com um caso que nunca tinha visto antes... quando eu entro no sistema consigo transmitir a primeira nota de boa, a segunda nota que tento transmitir da erro no suporte a canais seguros...

O cliente está utilizando windows 10 com certificado A3, conferi as configurações do internet explorer, mais ta muito estranho, porque de a primeira nota ir e o restante não, da impressao que o componente estaria travando o certificado sei la, porque fecha o sistema e abre novamente funciona a primeira vez.

Enfim, vou buscar a maquina do cliente e o certificado e tentar resolver agora a tarde, qualquer novidade eu posto aqui

Se alguém tiver alguma idéia do que possa ser

grato.

Link para o comentário
Compartilhar em outros sites

Realmente no demo não ocorreu... o que faço de diferente aqui é criar o AcbrNFe em runtime por uma classe que tenho para geração de nfe...

no destructor desta classe eu tenho assim

  FreeAndNil(self.FAcbrNFe);

será que pode ser alguma coisa que ficou preso na memoria e na segunda tentativa está bloqueando?

grato

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

abrindo duas instancias do meu sistema, consigo enviar uma nota em um e depois no outro, porem a segunda tentativa em qualquer instancia esta dando pau

acredito que deva estar com algum problema na rotina de liberar o certificado nas units da capicom

apesar de eu nao gostar desta solucao, vou criar uma classe singleton para guardar a instancia do componente AcbrNFe, mais isto esta ocorrendo na trunk 2 pois na trunk 1 trabalhava normal...

assim que eu terminar de deixar como singleton eu posto aqui dizendo se deu certo

Link para o comentário
Compartilhar em outros sites

galera resolvi o meu problema temporariamente criando uma classe singleton para devolver a instancia do acbrnfe, particularmente não gosto desta solução, acho que vale a pena dar uma olhada na questao da liberação do certificado pelo componente. Vou tentar fazer o debug com mais tempo pra ver se consigo alguma solução nesta questao.

Editado por marcianobandeira
Link para o comentário
Compartilhar em outros sites

  • Fundadores

Verifique se é algo relacionado com as chamadas em Inicialization e finalization de ACBrDFeCapicom.pas... experimente movê-las para "Create" e "Destroy"

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Então... deixa o campo senha em branco e tente novamente!

Em cima! deixando o campo senha em branco foi sem problemas... 

provavel que o problema esteja neste trecho de codigo do ACBrDFeCapicom.pas ne...

 

    // Atribuindo Senha para memória, se o Certificado for A3 //
    if (Senha <> '') and PrivateKey.IsHardwareDevice then
    begin
      XML := SignatureElement('', False);

      xmldoc := CoDOMDocument50.Create;
      xmldoc.async := False;
      xmldoc.validateOnParse := False;
      xmldoc.preserveWhiteSpace := True;
      xmldoc.loadXML(XML);
      xmldoc.setProperty('SelectionNamespaces', DSIGNS);

      xmldsig := CoMXDigitalSignature50.Create;
      xmldsig.signature := xmldoc.selectSingleNode('.//ds:Signature');
      xmldsig.store := FCertStoreMem;

      dsigKey := xmldsig.createKeyFromCSP(PrivateKey.ProviderType,
        PrivateKey.ProviderName, PrivateKey.ContainerName, 0);
      if (dsigKey = nil) then
        raise EACBrDFeException.Create('Erro ao criar a chave do CSP.');

      SigKey := dsigKey as IXMLDSigKeyEx;
      SigKey.getCSPHandle(hCryptProvider);
      try
        CryptSetProvParam(hCryptProvider, PP_SIGNATURE_PIN, Windows.PBYTE(Senha), 0);
      finally
        CryptReleaseContext(hCryptProvider, 0);
      end;

      SigKey := nil;
      dsigKey := nil;
      xmldsig := nil;
      xmldoc := nil;
    end;

Link para o comentário
Compartilhar em outros sites

Use o WinMerge e compare... esse código é idêntico no Trunk

Daniel, não usei o winmerge aqui mais fiz o seguinte teste

deixei a senha do certificado informada

no primeiro envio foi de boa

no segundo envio eu forcei (via debug do xe8) pular este if que mencionei acima foi de boa

no terceiro envio eu forcei novamente e foi de boa..

no quarto envio deixei o codigo entrar no if e deu o problema... 

uma soluçao, nao muito bonita, seria criar um dictionary estatico guardando o numero de serie do certificado digital, entao so entraria no if caso o numero de serie nao estivesse no dictionary... isso iria mascarar o problema

 

att

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

No meu caso, nem alimento a propriedade senha do certificado apenas o número de série e mesmo assim o problema ocorre, porém não tem uma lógica como o colega Marciano mencionou. No meu caso o problema ocorre bem aleatoriamente, em alguns clientes não ocorre nunca, em outros, ocorre mas seguidamente que os outros. Depois que da o erro, é só fechar a aplicação e abrir novamente que volta a funcionar ! 

 

Link para o comentário
Compartilhar em outros sites

achei o trecho de codigo na trunk 1 em ACBrNFeConfiguracoes... mais mesmo trocando por ele ocorre o erro a partir da segunda vez

               if (FSenhaCert <> '') and PrivateKey.IsHardwareDevice then
                begin

                  XML := XML + '<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />';
                  XML := XML + '<Reference URI="#">';
                  XML := XML + '<Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />';
                  XML := XML + '<DigestValue></DigestValue></Reference></SignedInfo><SignatureValue></SignatureValue><KeyInfo></KeyInfo></Signature>';

                  xmldoc := CoDOMDocument50.Create;
                  xmldoc.async              := False;
                  xmldoc.validateOnParse    := False;
                  xmldoc.preserveWhiteSpace := True;
                  xmldoc.loadXML(XML);
                  xmldoc.setProperty('SelectionNamespaces', DSIGNS);

                  xmldsig := CoMXDigitalSignature50.Create;
                  xmldsig.signature := xmldoc.selectSingleNode('.//ds:Signature');
                  xmldsig.store := CertStoreMem;

                  dsigKey := xmldsig.createKeyFromCSP(PrivateKey.ProviderType, PrivateKey.ProviderName, PrivateKey.ContainerName, 0);
                  if (dsigKey = nil) then
                     raise EACBrNFeException.Create('Erro ao criar a chave do CSP.');

                  SigKey := dsigKey as IXMLDSigKeyEx;
                  SigKey.getCSPHandle( hCryptProvider );

                  try
                     CryptSetProvParam( hCryptProvider , PP_SIGNATURE_PIN, windows.PBYTE(FSenhaCert), 0 );
                  finally
                    CryptReleaseContext(hCryptProvider, 0);
                  end;

                  SigKey    := nil;
                  dsigKey   := nil;
                  xmldsig   := nil;
                  xmldoc    := nil;
               end;

 

 

Editado por marcianobandeira
Link para o comentário
Compartilhar em outros sites

  • Fundadores

Olá Marciano,

Muito obrigado pela analise... baseado na sua sugestão, apliquei verificação semelhante nos fontes atuais...

Tentei de toda maneira, fazer com que dois Executáveis pudessem usar o mesmo Certificado A3, e com a atribuição de Senha automática... Mas isso não foi possível... Sempre que o segundo programa se autentica com o PIN, ele remove o acesso ao certificado da instância anterior...

Aproveitei e subi algumas modificações que eu tinha pendente... se puder testá-las eu agradeço...

18/08/2015   (por: DSA)
-- ACBrDFeCapicom --
[+]  Implementado o uso de Certificados A1 por Arquivo PFX,
    Sem necessitar da instalação do Certificado.Exemplo:
    ACBrNFe1.Configuracoes.Certificados.ArquivoPFX := 'c:\temp\CertificadoA1.pfx';
    ACBrNFe1.Configuracoes.Certificados.Senha := '1234';
[*] Refatoração de código na atribuição de Senha de Certificados A3
[*] Revisão de rotinas para liberação de Recursos alocados
[-] Correção de "Erro no suporte a canais seguros" a partir da segunda requisicao.
    o que ocorre quando o mesmo Certificado A3 é atribuido a várias instâncias do
    componente, e com a atribuição automática de Senha  (por:  Marciano Bandeira)
    http://www.projetoacbr.com.br/forum/index.php?showtopic=23668

-- ACBrHTTPReqResp --
[*] Revisão de rotinas para liberação de Recursos alocados

 

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Olá Marciano,

Muito obrigado pela analise... baseado na sua sugestão, apliquei verificação semelhante nos fontes atuais...

Tentei de toda maneira, fazer com que dois Executáveis pudessem usar o mesmo Certificado A3, e com a atribuição de Senha automática... Mas isso não foi possível... Sempre que o segundo programa se autentica com o PIN, ele remove o acesso ao certificado da instância anterior...

Aproveitei e subi algumas modificações que eu tinha pendente... se puder testá-las eu agradeço...

18/08/2015   (por: DSA)
-- ACBrDFeCapicom --
[+]  Implementado o uso de Certificados A1 por Arquivo PFX,
    Sem necessitar da instalação do Certificado.Exemplo:
    ACBrNFe1.Configuracoes.Certificados.ArquivoPFX := 'c:\temp\CertificadoA1.pfx';
    ACBrNFe1.Configuracoes.Certificados.Senha := '1234';
[*] Refatoração de código na atribuição de Senha de Certificados A3
[*] Revisão de rotinas para liberação de Recursos alocados
[-] Correção de "Erro no suporte a canais seguros" a partir da segunda requisicao.
    o que ocorre quando o mesmo Certificado A3 é atribuido a várias instâncias do
    componente, e com a atribuição automática de Senha  (por:  Marciano Bandeira)
    http://www.projetoacbr.com.br/forum/index.php?showtopic=23668

-- ACBrHTTPReqResp --
[*] Revisão de rotinas para liberação de Recursos alocados

 

Blz Daniel testei aqui com certificado A3 e o problema está resolvido.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3362 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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...