Ir para conteúdo
  • Cadastre-se

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

Recommended Posts

Postado

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.

Postado

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
Postado

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

Postado (editado)

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
Postado

Acredito que não seja, ao menos neste arquivo ACBrDFeCapicom.pas, veja como está 

initialization
  CoInitialize(nil); // PERMITE O USO DE THREAD

finalization
 CoUninitialize;

end.

De qualquer forma, estou tentando conseguir um certificado a3 aqui e vou realizar novos testes agora a tarde.

Postado (editado)

geralmente na trunk 1 eu so conferia as configuracoes do internet explorer e funcionava tranquilo, agora na trunk 2 estou quebrando a cabeca aqui tentando debugar, mais ainda nao consegui chegar em lugar algum

Editado por marcianobandeira
Postado

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;

Postado

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

  • Membros Pro
Postado

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 ! 

 

Postado (editado)

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
Postado (editado)

Se eu não alimentar a propriedade senha esse problema não deveria ocorrer, certo ?

 

na trunk 2 nao ocorre se deixar em branco o campo senha... quando informa o campo senha, da certo o primeiro envio, no segundo da pau

 

Editado por marcianobandeira
  • Membros Pro
Postado

Então, estou usando trunk1 ainda pelo fato de ter NFSe na mesma aplicação e no Trunk2 NFSe ainda não está migrado, mas pelo que vi no trecho de código que vc postou do Trunk1, não deveria entrar na rotina se eu não informar o campo senha...

 

Postado

 

Então, estou usando trunk1 ainda pelo fato de ter NFSe na mesma aplicação e no Trunk2 NFSe ainda não está migrado, mas pelo que vi no trecho de código que vc postou do Trunk1, não deveria entrar na rotina se eu não informar o campo senha...

 

isso, nao vai entrar se deixar em branco

  • Fundadores
Postado

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.

Postado

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
  • Este tópico foi criado há 3376 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.