Jump to content

dev botao

Encerramento Sistema Pedindo Certificado


Go to solution Solved by Daniel Simoes,
  • Este tópico foi criado há 1694 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro

Bom dia,

Está ocorrendo uma situação estranha: após emitir uma nota fiscal e, por consequência estabelecer uma conexão dos componente Acbr com o certificado digital, ao se encerrar nosso sistema, está abrindo a tela do Windows pedindo que se conecte o certificado (print anexo).

 Isso só ocorre se, após emitida a nota fiscal e antes de fechar o sistema, se desplugar o usb da leitora do certificado.

Usamos :     
- Certificado A3 
- ACBrNFe1.SSL.SSLType := LT_TLSv1_2;
- ACBrNFe1.Configuracoes.Geral.SSLCryptLib := cryOpenSSL; 
- ACBrNFe1.Configuracoes.Geral.SSLHttpLib := httpOpenSSL; 
- ACBrNFe1.Configuracoes.Geral.SSLXmlSignLib := xsLibXml2;

Pelo que entendi, algum procedimento precisa do token conectado, mas qual e quando?


Isso é normal ou há alguma rotina (algum componente.free, não sei) que deveria ser feito e de repente não estamos fazendo?

É claro que esse procedimento (desplugar o token) não é recomendável, mas nunca se sabe quando e o que o usuário faz. Então, quanto menos telas e erros forem apresentados a ele, melhor...

ErroFecharSistema.png

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Moderadores
1 hora atrás, valdirdill disse:

Usamos :     
- Certificado A3 
- ACBrNFe1.SSL.SSLType := LT_TLSv1_2;
- ACBrNFe1.Configuracoes.Geral.SSLCryptLib := cryOpenSSL; 
- ACBrNFe1.Configuracoes.Geral.SSLHttpLib := httpOpenSSL; 
- ACBrNFe1.Configuracoes.Geral.SSLXmlSignLib := xsLibXml2;

Com essa configuração não devia funcionar de forma alguma, OpenSSL não suporta certificados A3.

Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link to comment
Share on other sites

  • Membros Pro
1 hora atrás, BigWings disse:

Com essa configuração não devia funcionar de forma alguma, OpenSSL não suporta certificados A3.

De fato. Erro meu de Ctrl+C e Ctrl+V, rs..

O correto:

SSLCryptLib := cryWinCrypt;

SSLHttpLib := httpWinHttp;

SSLXmlSignLib := xsLibXml2;

Obrigado.

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Membros Pro
2 horas atrás, Italo Jurisato Junior disse:

Bom dia Valdir,

Para resolver esse problema basta trocar essa porcaria de A3 pelo A1.

 

Obrigado pela sugestão @Italo Jurisato Junior , mas não ajuda muito.

Eu também penso assim, ou seja, que o usuário deve usar certificado A1. Mas não posso obrigar centenas de usuários a comprar o hardware que EU quero.

O que podemos fazer é sempre orientamos a usar A1, mas nossos clientes são livres para fazer como acharem melhor.

Se fosse tão simples, o próprio Acbr já poderia ter esse bloqueio e não aceitar A3, que tal? Não seria viável, pois, apesar do A3 ser essa porcaria, temos que aceitar que existe.

Nosso papel como desenvolvedor é orientar, mas o usuário também pode ter seus critérios de escolha, segurança, etc. Nosso papel é tentar facilitar o processo, sempre que possível. Isso é o que penso!

Abraços.

  • Like 1

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Consultores
3 horas atrás, valdirdill disse:

Isso é normal ou há alguma rotina (algum componente.free, não sei) que deveria ser feito e de repente não estamos fazendo?

É claro que esse procedimento (desplugar o token) não é recomendável, mas nunca se sabe quando e o que o usuário faz. Então, quanto menos telas e erros forem apresentados a ele, melhor...

ErroFecharSistema.png

Olá Valdir,

   Essa mensagem não é levantada pelo componente em si. Note que a mensagem é do Windows. Na barra de título está escrito "Segurança do Windows". Como você deve saber, os certificados A3 usando WinCrypt são acessados via Windows.

   Não sou especialista em certificados, mas pelo que você descreveu imagino que o Windows está detectando que o usuário removeu o certificado enquanto ainda em uso. Seria algo semelhante a remover o pendrive enquanto está rodando o chkdsk nele. Daí o Windows percebe que está errado e avisa o único que pode corrigir a situação - o usuário.

   Se o cenário for realmente esse, talvez exista alguma maneira de dizer ao Windows que não se está mais usando o certificado. Digamos que isso seja possível, não posso afirmar que seria viável ao componente.

  • Like 3

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

  • Membros Pro
1 minuto atrás, EMBarbosa disse:

Olá Valdir,

   Essa mensagem não é levantada pelo componente em si. Note que a mensagem é do Windows. Na barra de título está escrito "Segurança do Windows". Como você deve saber, os certificados A3 usando WinCrypt são acessados via Windows.

   Não sou especialista em certificados, mas pelo que você descreveu imagino que o Windows está detectando que o usuário removeu o certificado enquanto ainda em uso. Seria algo semelhante a remover o pendrive enquanto está rodando o chkdsk nele. Daí o Windows percebe que está errado e avisa o único que pode corrigir a situação - o usuário.

   Se o cenário for realmente esse, talvez exista alguma maneira de dizer ao Windows que não se está mais usando o certificado. Digamos que isso seja possível, não posso afirmar que seria viável ao componente.

Sim, também acho que seja isso, ou seja, é uma interceptação do Windows. Mas o estranho é que ocorre somente quando tento encerrar minha aplicação, entende?

Se o usuário desplugar o certificado e a minha aplicação ficar 2 horas ativa, nada vai acontecer até que ela não seja encerrada.

Mas tranquilo, eu imaginei que houvesse alguém que já tivesse passado por situação parecida. A ideia seria justamente isso que você mencionou, ou seja, alguma função que "dissesse" ao Windows que o certificado já não estaria mais em uso.

Obrigado.

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Consultores
1 minuto atrás, valdirdill disse:

Se o usuário desplugar o certificado e a minha aplicação ficar 2 horas ativa, nada vai acontecer até que ela não seja encerrada.

Mas tranquilo, eu imaginei que houvesse alguém que já tivesse passado por situação parecida. A ideia seria justamente isso que você mencionou, ou seja, alguma função que "dissesse" ao Windows que o certificado já não estaria mais em uso.

Obrigado

Eu particularmente nunca vi essa mensagem. Então investigaria se no Visualizador de Eventos do Windows tem alguma informação que pode ser útil.

Mas talvez alguém mais tenha alguma outra informação.

  • Like 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link to comment
Share on other sites

  • Fundadores

Essa janela do Windows consome muito recursos...

Não use ela... veja no Demo do ACBrNFe como você pode criar a sua própria janela de escolha de certificados 

  • Like 1
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 to comment
Share on other sites

  • Membros Pro
8 minutos atrás, Daniel Simoes disse:

Essa janela do Windows consome muito recursos...

Não use ela... veja no Demo do ACBrNFe como você pode criar a sua própria janela de escolha de certificados 

Não é minha aplicação que chama essa janela do Windows. Ela aparece sozinha, hehe!

Estou investigando e percebi que a situação ocorre no encerramento da minha aplicação porque é neste momento que a aplicação destroi o dataModule e nele estã o componente ACBrNFe1 que carregou o certificado ao enviar a nota.

Se, ao invés de fechar a aplicação, eu apenas fizer um ACBrNFe1.Free, acontece o mesmo problema, ou seja, aparecerá essa janela do Windows pedindo o certificado. Esse ACBrNFe1.Free chama TDFeWinCrypt.DescarregarCertificado.

Debugando percebi que a janela abre ao ser executado SetCertContextPassword( FpCertContext, '' ) da procedure TDFeWinCrypt.DescarregarCertificado;    

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Fundadores
  • Solution
4 horas atrás, valdirdill disse:

Não é minha aplicação que chama essa janela do Windows. Ela aparece sozinha, hehe!

Ela aparece quando você chama

ACBrNFe1.SSL.SelecionarCertificado;

Você poderia fazer algo como:

procedure TfrmACBrNFe.sbtnNumSerieClick(Sender: TObject);
var
  I: Integer;
  AddRow: Boolean;
begin
  ACBrNFe1.SSL.LerCertificadosStore;
  AddRow := False;

  with frmSelecionarCertificado.StringGrid1 do
  begin
    ColWidths[0] := 220;
    ColWidths[1] := 250;
    ColWidths[2] := 120;
    ColWidths[3] := 80;
    ColWidths[4] := 150;

    Cells[0, 0] := 'Num.Série';
    Cells[1, 0] := 'Razão Social';
    Cells[2, 0] := 'CNPJ';
    Cells[3, 0] := 'Validade';
    Cells[4, 0] := 'Certificadora';
  end;

  for I := 0 to ACBrNFe1.SSL.ListaCertificados.Count-1 do
  begin
    with ACBrNFe1.SSL.ListaCertificados[I] do
    begin
      if (CNPJ <> '') then
      begin
        with frmSelecionarCertificado.StringGrid1 do
        begin
          if Addrow then
            RowCount := RowCount + 1;

          Cells[0, RowCount-1] := NumeroSerie;
          Cells[1, RowCount-1] := RazaoSocial;
          Cells[2, RowCount-1] := CNPJ;
          Cells[3, RowCount-1] := FormatDateBr(DataVenc);
          Cells[4, RowCount-1] := Certificadora;

          AddRow := True;
        end;
      end;
    end;
  end;

  frmSelecionarCertificado.ShowModal;

  if frmSelecionarCertificado.ModalResult = mrOK then
    edtNumSerie.Text := frmSelecionarCertificado.StringGrid1.Cells[0, frmSelecionarCertificado.StringGrid1.Row];
end;

 

Veja um tópico sobre o problema com essa janela do Windows "CryptUIDlgSelectCertificateFromStore"

https://social.msdn.microsoft.com/Forums/WINDOWS/en-US/9c322481-f515-49de-8cd1-dd0f495d680a/cryptuidlgselectcertificatefromstore-crash-on-windows-10?forum=windowsgeneraldevelopmentissues

4 horas atrás, valdirdill disse:

Debugando percebi que a janela abre ao ser executado SetCertContextPassword( FpCertContext, '' ) da procedure TDFeWinCrypt.DescarregarCertificado;    

Tenho um A3.. e posso investigar... como posso reproduzir o problema, usando o Demo do ACBrNFe ? (quais são os passos necessários ?)

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 to comment
Share on other sites

  • Membros Pro

Bom dia,

Depois de muita lida e ajuda de todos, ao que tudo indica, o problema está resolvido.
Para registro vou explicar o que estava fazendo e, segundo a dica passada pelo @Daniel Simoes, não era a forma ideal. 

Vamos lá:

O que preciso é que sejam alimentadas duas variáveis (VCNPJCert e VVctoCert) para uso em outras rotinas. Isso precisa ser feito antes de qualquer outra operação relacionada a documentos fiscais.

Logicamente que primeiro são alimentadas todas as propriedades SSL do componente ACBrNFe1 e que não precisa detalhar aqui.

Forma que eu estava (errada)
- ACBrNFe1.SSL.NumeroSerie := SerieDoCertGravadaEmIni;
- VVctoCert := ACBrNFe1.SSL.CertDataVenc; //esta linha e a próxima, disparavam a rotina ACBrNFe1.SSL.SelecionarCertificado, a qual, além de ser mais lenta, gerava o problema depois quando a aplicação era encerrada e destruía o componente ACBrNFe1, que foi o problema inicial deste post.
- VCNPJCert := ACBrNFe1.SSL.CertCNPJ;

 

Forma ideal (correta)
- ACBrNFe1.SSL.LerCertificadosStore;
- for I := 0 to ACBrNFe1.SSL.ListaCertificados.Count-1 do
   With ACBrNFe1.SSL.ListaCertificados do
     begin
      if NumeroSerie = SerieDoCertGravadaEmIni then //se é o certificado que o usuário selecionou no módulo de parametrização 
       begin
        VVctoCert := DataVenc;
        VCNPJCert := CNPJ;
       end;
     end;

 

Obrigado a todos.

Edited by valdirdill
  • Like 3
  • Thanks 1

Valdir Dill

Rio de Janeiro - RJ

 

 

Link to comment
Share on other sites

  • Administradores

Obrigado por reportar.

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

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 !!

Link to comment
Share on other sites

  • Este tópico foi criado há 1694 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Guest
This topic is now closed to further replies.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.