Ir para conteúdo
  • Cadastre-se

dev botao

SSL.CarregarCertificado Demorada


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

Recommended Posts

  • Membros Pro

Bom dia,

Depois da última atualização dos fontes, a função  AcbreNFe1.SSL.CarregarCertificado ficou bem mais lenta.
Isso é normal ou será que estou deixando de configurar algo?

Obs.: isso acontece apenas na primeira vez que essa rotina é executada. Se executar pela segunda vez, não há nenhuma demora.

Configuração utilizada:
 - Certificado A3;
 - AcbreNFe1.Configuracoes.Geral.SSLLib := libCapicomDelphiSoap;
 - AcbreNFe1.Configuracoes.Geral.SSLCryptLib := cryCapicom;
 - AcbreNFe1.Configuracoes.Geral.SSLHttpLib := httpIndy;
 - AcbreNFe1r.Configuracoes.Geral.SSLXmlSignLib  := xsMsXmlCapicom;


Obrigado!

Valdir Dill

Rio de Janeiro - RJ

 

 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Boa tarde,

A configuração ficaria assim, certo?

acbreNFe1.Configuracoes.Geral.SSLLib := libWinCrypt;
acbreNFe1.Configuracoes.Geral.SSLCryptLib := cryWinCrypt;
acbreNFe1.Configuracoes.Geral.SSLHttpLib := httpWinHttp;
acbreNFe1.Configuracoes.Geral.SSLXmlSignLib  := xsMsXml;

Fiz essa mudança e a demora na rotina AcbreNFe1.SSL.CarregarCertificado continua(5 a 6 segundos).

Mas agora há um outro problema. A execução simplesmente trava em um certo ponto.

Consegui debugar até a linha 277 da ACBrWinHTTPReqResp.pas, ou seja, na rotina "if not WinHttpSendRequest( pRequest,
                                   LPCWSTR(wHeader), Length(wHeader),
                                   WINHTTP_NO_REQUEST_DATA, 0,
                                   Length(Self.Data), 0) then....

Depois disso não anda mais e nenhum erro acontece, nada..

Alguma dica?                          

Obrigado!      

6 horas atrás, valdirdill disse:

Bom dia,

Depois da última atualização dos fontes, a função  AcbreNFe1.SSL.CarregarCertificado ficou bem mais lenta.
Isso é normal ou será que estou deixando de configurar algo?

Obs.: isso acontece apenas na primeira vez que essa rotina é executada. Se executar pela segunda vez, não há nenhuma demora.

Configuração utilizada:
 - Certificado A3;
 - AcbreNFe1.Configuracoes.Geral.SSLLib := libCapicomDelphiSoap;
 - AcbreNFe1.Configuracoes.Geral.SSLCryptLib := cryCapicom;
 - AcbreNFe1.Configuracoes.Geral.SSLHttpLib := httpIndy;
 - AcbreNFe1r.Configuracoes.Geral.SSLXmlSignLib  := xsMsXmlCapicom;


Obrigado!

Desculpem a emenda, mas deixei de passar 3 informações que acho são importantes:
1 - Fiz todos os testes também no demo ACBR e o mesmo problema do travamento também ocorre;
2 - Não chega nem a ser mostrada a telinha de login do certificado;
3 - Se eu mudar para libCapicom ou libCapicomDelphiSoap, tanto no meu sistema, domo no demo ACBR aí funciona beleza.

Obrigado!

Valdir Dill

Rio de Janeiro - RJ

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Você tem código demais... Isso:

acbreNFe1.Configuracoes.Geral.SSLLib := libWinCrypt;

equivale a isso:

acbreNFe1.Configuracoes.Geral.SSLCryptLib := cryWinCrypt;
acbreNFe1.Configuracoes.Geral.SSLHttpLib := httpWinHttp;
acbreNFe1.Configuracoes.Geral.SSLXmlSignLib  := xsMsXml; 

Não tenho ideia do que cause a lentidão... somente debugando com o seu certificado, provavelmente é algo em: "procedure TDFeWinCrypt.CarregarCertificado"

Pelo que você descreveu, o problema está na Unit "ACBrWinHTTPReqResp.pas" que é usada quando você configura:

acbreNFe1.Configuracoes.Geral.SSLHttpLib := httpWinHttp;

Nesse caso, experimente configurar ACBrNFe.SSL.SSLType

Se você usar:

acbreNFe1.Configuracoes.Geral.SSLHttpLib := httpWinINet;

Rodará o código de "ACBrWinINetReqResp.pas", que é mesmo código que é chamado pela antiga libCapicom (e que usa o SSLType definido no I.E.)

 

2 horas atrás, valdirdill disse:

Consegui debugar até a linha 277 da ACBrWinHTTPReqResp.pas, ou seja, na rotina "if not WinHttpSendRequest( pRequest,
                                   LPCWSTR(wHeader), Length(wHeader),
                                   WINHTTP_NO_REQUEST_DATA, 0,
                                   Length(Self.Data), 0) then....

Como está a sua configuração de: ACBrNFe1.SSL.TimeOut ?

 

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

Boa tarde,

Quando faço envio de duas notas seguidas a primeira vai normal mas a segunda estava dando o erro na classe ACBrWinINetReqResp na linha if HttpSendRequest(pRequest, nil, 0, Pointer(Data), Length(Data)) then

Messagem: Project.exe raised exception class $C0000005 with message 'access violation at 0x769866f9: read of address 0x1808801a'. o qual trava o programa e pede para fechar.

Ai utilizei a configuração que o Daniel mostrou e a principio os problemas com access violation foram resolvidos com a configuração: AcbrNFE.Configuracoes.Geral.SSLLib := libWinCrypt;

Porem tive problemas com os certificados A3 que retorna a seguinte mensagem

 O atributo 'Algorithm' tem valor
'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256' que não corresponde ao valor fixo
'http://www.w3.org/2000/09/xmldsig#sha1' no DTO ou esquema.

Será que isso pode ter relação com o problema do Valdir?

 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro
13 horas atrás, Daniel Simoes disse:

Você tem código demais... Isso:


acbreNFe1.Configuracoes.Geral.SSLLib := libWinCrypt;

equivale a isso:


acbreNFe1.Configuracoes.Geral.SSLCryptLib := cryWinCrypt;
acbreNFe1.Configuracoes.Geral.SSLHttpLib := httpWinHttp;
acbreNFe1.Configuracoes.Geral.SSLXmlSignLib  := xsMsXml; 

Não tenho ideia do que cause a lentidão... somente debugando com o seu certificado, provavelmente é algo em: "procedure TDFeWinCrypt.CarregarCertificado"

Pelo que você descreveu, o problema está na Unit "ACBrWinHTTPReqResp.pas" que é usada quando você configura:


acbreNFe1.Configuracoes.Geral.SSLHttpLib := httpWinHttp;

Nesse caso, experimente configurar ACBrNFe.SSL.SSLType

Se você usar:


acbreNFe1.Configuracoes.Geral.SSLHttpLib := httpWinINet;

Rodará o código de "ACBrWinINetReqResp.pas", que é mesmo código que é chamado pela antiga libCapicom (e que usa o SSLType definido no I.E.)

 

Como está a sua configuração de: ACBrNFe1.SSL.TimeOut ?

 

Bom dia Daniel,

Obrigado pelo retorno:

Seguinte:

Sobre o "código demais", ainda estamos aprendendo o que devemos e o que não devemos setar, hehe! Eu setei as 4 propriedades porque no demo também está setando. Então, se entendi corretamente a sua orientação, é preciso apenas atribuir um valor para Configuracoes.Geral.SSLLib. As outras 3 o componente assume automaticamente em consequência disso, está correto?

Mudei  a propriedade "Configuracoes.Geral.SSLHttpLib := httpWinINet" conforme você sugeriu e aí deu tudo certo. A telinha do login apareceu em 2 segundos.
Obs.: 
1) Na mudança acima, mantive Configuracoes.Geral.SSLLib := libWinCrypt;
2) Ao efetuar a mudança, o comportamento é o mesmo tanto no meu sistema, como no demo ACBR, ou seja, se deixo SSLHttpLib := httpWinINet, a tela de login do certificado aparece e o processo flui normalmente, mas se mudar para SSLHttpLib := httpWinHttp, a tela de login não aparece e a compilação vai só até essa linha da unit que informei no post inicial e trava. Não tenho como prosseguir com o debug a partir dali. 

Configuracoes.WebServices.TimeOut = 5000

Obrigado!

Valdir Dill

Rio de Janeiro - RJ

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Ahhh.. você não especificou a senha do certificado para o componente... acredito que por isso a API WinHTTP não funcione. Ja a WinINet usa o I.E., e por isso tem habilidade de exibir essa janela 

  • Curtir 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 para o comentário
Compartilhar em outros sites

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

Ahhh.. você não especificou a senha do certificado para o componente... acredito que por isso a API WinHTTP não funcione. Ja a WinINet usa o I.E., e por isso tem habilidade de exibir essa janela 

Bom fia,

ACBrNFe1.SSL.Senha := 'senha', certo?

Infelizmente não é o caso. Eu realmente não tinha colocado a senha. Mas fiz novos testes agora informando a senha do certificado e ficou na mesma. Testei tanto no meu sistema, como no demo. 

Obrigado!

Valdir Dill

Rio de Janeiro - RJ

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

O que você diz com "ficou na mesma" ?

Ele congela na linha do ACBrWinHTTPreqResp, informada nos posts anterior ?

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

  • Membros Pro

Exato Daniel, congela nesse ponto.

Olha outra coisa coisa que descobri agora:

Se eu colocar um break point nessa linha 277 ( if not WinHttpSendRequest( pRequest,...) da ACBrWinHTTPReqResp.pas. Aí a compilação para ali. Então pressiono F9 e nada, fica congelado. Já fiz um teste aguardando 1 minuto. Se deixar sem break point, também não vai.
Porém, se nesse break point eu pressionar F8 e não o F9, ele processa normal, ou seja, abre a telinha de login do certificado certinho.

Será que não é alguma coisa no sistema do certificado ou da máquina? O estranho é que configurando para Capicom ele funciona, como sempre funcionou.

Obrigado!
 

Valdir Dill

Rio de Janeiro - RJ

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Humm.. eu desconfio, que a tela de pergunta de senha do certificado, que é exibida pelo Windows... está sendo exibida em "Segundo Plano" (ficando escondida)

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

  • Membros Pro

Concordo. Nitidamente é essa a impressão que dá. É como se a tela estivesse aberta aguardando se digitar a senha.

Mas tive esse problemas da tela de senha ficar "por trás" no passado e posso garantir que a tela do certificado não está ativa, nem mesmo em segundo plano. Já fiz todas as análises possíveis no intuito de verificar se a telinha está em segundo plano,  mas não está.

Minha opinião é que tem alguma coisa impedindo que a tela seja apresentada  Se configurar para Capicom, o problema não acontece.Além disso, com o F8 depois do break point o processo flui normal, mas com F9, não. Muito sinistro.

Algum outro colega que acompanha este post já testou a nova libWinCrypt com A3? Talvez seja meu certificado ou máquina conflitando com alguma rotina nova do Acbr, sei lá.

Obrigado!

Valdir Dill

Rio de Janeiro - RJ

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Eu recomendo você não depender de janelas de dialogo do Windows... elas sempre causam problemas, como falta de memória, falta de foco, etc...

Informe a senha por código que ele não precisará abrir nenhuma janela... (Teste no Demo do ACBr)

Você poderia criar a sua própria janela de pergunta da Senha, e então informá-la ao ACBrNFe1.SSL.Senha

A atribuição de senha do ACBr, para o A3, é bastante segura, e irá retornar erro específico, no caso de Senha inválida ou outro erro... Veja:

procedure SetCertContextPassword(ACertContext: PCCERT_CONTEXT; APass: AnsiString);SetCertContextPassword

em ACBrDFeWinCrypt.pas

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

  • Membros Pro

Conforme relatei, eu já fiz esse teste de colocar a senha, inclusive no demo, sem resultados positivos.

Mas agora me levantou uma dúvida. É possível eu setar a senha em um A3 e, com isso, ele não pedir mais a senha, ou seja, dispensaria a janelinha de login, é isso?

Nunca consegui fazer isso. Eu atribuo a senha (ACBrNFe1.SSL.Senha := 'senha'), mas a janelinha do login é solicitada igual. Isso no caso da Capicom, pois no caso da libWinCrypt está com esse problema.

Só me confirma isso então, se ACBrNFe1.SSL.Senha tiver valor, a janelinha de login do certificado NÃO deve aparecer? Se for isso, então deve ser algo no meu certificado ou no gerenciador dele.

Obrigado

Valdir Dill

Rio de Janeiro - RJ

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

com a senha no componente, não deverá aparecer a janela do Windows solicitando a senha...

Debug "procedure SetCertContextPassword" e veja se ocorre algum erro...

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

  • Membros Pro

Debugado e não ocorreu nenhum erro. Chegou até na linha  566 com pfCallerFreeProv = true.

Fiz outro teste informando a senha errada propositadamente. Aí deu o erro "O cartão não pode ser acessado porque o PIN errado foi apresentado" nessa procedure.

Ou seja, o componente está recebendo a senha de forma correta, está testando ela e está passando, tudo certo.

Já estamos ficando sem opções, hehe!

Acho que vou tentar remover o Charismatics (gerenciador do certificado) e reinstalá-lo. Vi num post mais antigo um colega que estava com problema parecido e reinstalou o gerenciador e resolveu. O dele era Certisign, mas.... 

Obrigado!

Valdir Dill

Rio de Janeiro - RJ

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Achei alguns bugs nos fontes de "ACBrWinHTTPReqResp.pas"... curiosamente, o problema só afetava o Delphi.

Enviei uma possível correção para o SVN

 

  • Curtir 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 para o comentário
Compartilhar em outros sites

  • Fundadores

Fiz um teste com o Delphi Tokyo, A3, sem senha, usando a httpWinHttp... e aparentemente deu tudo certo... veja a imagem abaixo:

z8n5j51b2U4cgAAAABJRU5ErkJgggA=

 

Acredito que realmente deve depender do Gerenciador de Certificado instalado...

Muito estranho o método "SetCertContextPassword" rodar com sucesso, e mesmo assim, ele solicitar a senha... Pode me dizer algo mais sobre o seu certificado ?

Onde você comprou ? qual o modelo ? tem alguma página com informações sobre o mesmo ?

  • Curtir 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 para o comentário
Compartilhar em outros sites

  • Membros Pro
Em 25/03/2017 at 19:22, Daniel Simoes disse:

Fiz um teste com o Delphi Tokyo, A3, sem senha, usando a httpWinHttp... e aparentemente deu tudo certo... veja a imagem abaixo:

 

Acredito que realmente deve depender do Gerenciador de Certificado instalado...

Muito estranho o método "SetCertContextPassword" rodar com sucesso, e mesmo assim, ele solicitar a senha... Pode me dizer algo mais sobre o seu certificado ?

Onde você comprou ? qual o modelo ? tem alguma página com informações sobre o mesmo ?

Bom dia,

Certificado A3 da Caixa Econômica Federal. Usa o gerenciador Charismatics.

http://www.caixa.gov.br/empresa/identidade-digital/Paginas/default.aspx

Obrigado!

Valdir Dill

Rio de Janeiro - RJ

 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Infelizmente não tenho como investigar... pois não tenho esse certificado...

Tente algumas mudanças em "StoreName", e "StoreLocation"...

Tente ainda, usar uma função mais genérica de abertura de Store... veja o código comentado, comente a 1a versão e tente com a 2a versão (simplificada)

procedure TDFeWinCrypt.OpenSystemStore;
......

  FpStore := CertOpenStore(
      StoreProvider, 0, 0,
      StoreFlag or CERT_STORE_READONLY_FLAG,
      LPCTSTR( FpDFeSSL.StoreName ) );
  //FpStore := CertOpenSystemStore( 0, LPCTSTR(FpDFeSSL.StoreName) );  

 

  • Curtir 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 para o comentário
Compartilhar em outros sites

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