Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

  • Membros Pro
Postado

Boa tarde, 

Criei uma aplicação em delphi que faz a leitura dos documentos de NFe destinados do Sefaz utilizando os componente ACBR. Executando esta aplicação baixo todos os documentos destinados sem nenhum problema. Com o intuiuto de agilizar e automatizar este processo de leitura/baixa dos documento  criei uma aplicação que trabalho como um serviço do WINDOWS, esta aplicação de tempos em tempos executa a minha aplicaçõa em DELPHI para baixar as notas destinadas.

O problema é que quando executa a minha aplicação em DELPHI atraves deste serviço que criei, meu certificado retorna a mensagem de inativo/inoperante, certificado não encontrado, a mesmo aplicação DELPHI, se executo direto pelo exe funciona perfeitamente.

Alguem sabe me dizer se existe alguma particularidade que devo criar para que minha aplicação em delphi reconheça e abra o certificado mesmo quando executada via serviço do windows?

Obs.: Nestes testes estou utilizando um cetificado A3 (Token).

Agradeço.

@Fábio Eduardo de Souza

 

  • Membros Pro
Postado

Juliomar  , eu encontrei uma postagem de 2013, que falava de um assunto semelhante ao meu, inclusive com orientações suas, e fiz os testes , inclusive incluindo o ACTIVEX, FORMS e WINDOWS  no uses da minha aplicação, e,  para o certificado em PFX, funcionou perfeitinho.Não precisei nem incluir o usuário e senha no certificado.

Agora para o A3, alem da alteração no USES fiz a inclusão do usuário e senha no certificado e mesmo assim não funcionou.

André Ferreira, eu estou utilizando o método de abertura do certificado apenas na minha aplicação DELPHI que executei a partir do serviço. Não são duas aplicações que abrem o certificado.

O meu serviço apenas chama o executável em DELPHI que faz a leitura das notas destinadas.

 

@Fábio Eduardo de Souza

  • Membros Pro
Postado

Bom dia, 

Pessoal , ainda não consegui resolver o problema da leitura do certificado,  fiz outro teste nas aplicações instalando o certificado em PFX na máquina e referenciando o arquivo instalado TAMBEM NÃO FUNCIONA., gera a mensagem de inativo e inoperante: Certificado <numero serie> não encontrado.

Se rodo o executavel direto sem ser pelo serviço do windows o certificado é lido sem problemas.

Rodando o executavel via certviço do windows, Só consigo abrir certificados com arquivo PFX, sem que estejam instalados na máquina. Saberiam me dizer por que e o que estou fazendo de errado ?

Quando o o certificado esta instalado na máquina eu uso as seguintes configurações:

         acbr.Configuracoes.Geral.SSLLib                                  := TSSLLib(libCapicom);
         acbr.Configuracoes.Geral.SSLCryptLib                         := TSSLCryptLib(cryCapicom);
         acbr.Configuracoes.Geral.SSLHttpLib                           :  = TSSLHttpLib(httpWinInet);
         acbr.Configuracoes.Geral.SSLXmlSignLib                   := TSSLXmlSignLib(xsMsXmlCapicom);
         acbr.SSL.SSLType                                                             := TSSLType(LT_all);

E quando é um certificado via arquivo PFX utilizo as seguintes configurações:

         acbr.Configuracoes.Geral.SSLLib                                  := TSSLLib(libWinCrypt);
         acbr.Configuracoes.Geral.SSLCryptLib                        := TSSLCryptLib(cryWinCrypt);
         acbr.Configuracoes.Geral.SSLHttpLib                          := TSSLHttpLib(httpWinHttp);
         acbr.Configuracoes.Geral.SSLXmlSignLib                   := TSSLXmlSignLib(xsMsXml);
         acbr.SSL.SSLType                                                             := TSSLType(LT_all);
 

Obrigado.

@Fábio Eduardo de Souza

 

  • Consultores
Postado

Eu acredito que seja um problema de permissões. Talvez o usuário em que a aplicação esteja rodando não tenha permissão para acessar o certificado.

Veja esse exemplo:

https://forums.asp.net/t/1693131.aspx

 

  • Confuso 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.
  • Fundadores
Postado

Se você está usando arquivo PFX, não precisa instalar o certificado no Windows.. apenas aponte o caminho do arquivo, exemplo:

    ACBrNFe1.SSL.ArquivoPFX := 'c:\temp\ArquivoCertificado.pfx';

 

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.

  • Membros Pro
Postado

@Daniel Simoes  , boa tarde,

Quando eu utilizo apenas o arquivo PFX  como vc citou, sem instalar, apenas referenciando o caminho, funciona perfeitamente com o serviço.

O problema é quando tenho que utilizar o certificado que está instalado na máquina, seja o arquivo PFX(A1) ou o Token/cartao (A3),  ele não reconhece, não abre.

Vi uma postagem antiga sua onde vc mostra a criação de uma nova propriedade  na leitura dos certificados :

procedure TForm1.sbtnGetCertClick(Sender: TObject);
begin
  if (ACBrNFe1.SSL.SSLClass is TDFeCapicom) then
    TDFeCapicom(ACBrNFe1.SSL.SSLClass).StoreLocation := CAPICOM_LOCAL_MACHINE_STORE;

  edtNumSerie.Text := ACBrNFe1.SSL.SelecionarCertificado;
end;

Estudando os fontes encontrei a prorpiedade SSL.StoreLocation, alterei minhas configurações da seguinte maneira:

         acbr.Configuracoes.Geral.SSLLib                          := TSSLLib(libCapicom);
         acbr.Configuracoes.Geral.SSLCryptLib                := TSSLCryptLib(cryCapicom);
         acbr.Configuracoes.Geral.SSLHttpLib                 := TSSLHttpLib(httpWinInet);
         acbr.Configuracoes.Geral.SSLXmlSignLib          := TSSLXmlSignLib(xsMsXmlCapicom);
         acbr.SSL.SSLType                                                   := TSSLType(LT_all);
         acbr.SSL.StoreLocation                                         := slLocalMachine;

Só que estou em duvida se estou utilizando a propriedade correta para atender a alteração que vc fez acima da CAPICOM_LOCAL_MACHINE_STORE;.

Estou no caminho certo ??? Vou iniciar meus testes agora.

@Fábio Eduardo de Souza

 

6 horas atrás, EMBarbosa disse:

Eu acredito que seja um problema de permissões. Talvez o usuário em que a aplicação esteja rodando não tenha permissão para acessar o certificado.

Veja esse exemplo:

https://forums.asp.net/t/1693131.aspx

 

@EMBarbosa eu estou com usuario administrador da máquina, nesta máquina não existe outro usuario e mesmo assim não está lendo os certificados instalados. O Juliomar havia me passado um procedimento de colocar usuario e senha no serviço do windows , fiz a alteração mas mesmo assim não leu.

@Fábio Eduardo de Souza

 

  • Fundadores
Postado
11 minutos atrás, Fábio Eduardo de Souza disse:

Só que estou em duvida se estou utilizando a propriedade correta para atender a alteração que vc fez acima da CAPICOM_LOCAL_MACHINE_STORE;.

Acredito que SIM... veja o trecho de código abaixo:

procedure TDFeWinCrypt.OpenSystemStore;
var
  StoreFlag: DWORD;
  StoreProvider: LPCSTR;
begin
  if (FpStore <> Nil) then
    Exit;

  //TODO: Mapeaer demais tipos
  case FpDFeSSL.StoreLocation of
    slLocalMachine : StoreFlag := CERT_SYSTEM_STORE_LOCAL_MACHINE;
  else
    StoreFlag := CERT_SYSTEM_STORE_CURRENT_USER;
  end;

 

Se o certificado for A1, e estiver instalado... mesmo assim, vc pode exportá-lo e gerar um PFX...

Com A3, a limitação é o acesso ao Hardware...

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

  • Membros Pro
Postado

@Daniel Simoes,

Beleza, amanhã vou proceder com os testes para confirmar esta alteração. De uma forma ou de outra preciso fazer com que a aplicação leia os certificados instalados pois tenho varios clientes utilizando o A3 e o A1 instalados nas maquinas. Finalizando os testes eu posto os resultados aqui.

Por enquanto muito obrigado Daniel e pessoal do Forum.

@Fábio Eduardo de Souza

 

  • Membros Pro
Postado

Bom dia Pessoal,

Ainda referente a questão da leitura do certificado pelo serviço do windows, seguindo as orientações do @Juliomar Marchetti de cadastrar usuario e senha no serviço, consegui que o certificado digital em PFX que esta instalado na maquina do usuário ,funcione. Então quando o certificado digital éarquivo PFX(A1), instalado na maquina ou simplesmente referenciado nas configuraçõs do ACBR , funciona perfeitamente, o certificado é reconhecido e os processos que utilizam o certificado funcionam perfeitamente.

Agora... o tal do A3, não consigo fazer com que seja reconhecido, alterei a propriedade SSL.StoreLocation para localMachine e nada. Incluindo o usuario e senha no serviço do windows, como o Juliomar recomendou, ele gera a seguinte mensagem:

"O recipiente da chave não pôde ser aberto"

Está mensagem eu consegui extrair a partir de um log que implementei para teste na unit ACBrDFeWinCrypt.pas  método :

function GetCertIsHardware(ACertContext: PCCERT_CONTEXT): Boolean;
var
  dwKeySpec: DWORD;
  pfCallerFreeProv: LongBool;
  ProviderOrKeyHandle: HCRYPTPROV_OR_NCRYPT_KEY_HANDLE;
begin
  ProviderOrKeyHandle := 0;
  dwKeySpec := 0;
  pfCallerFreeProv := False;

  // Obtendo o Contexto do Provedor de Criptografia do Certificado //
  if not CryptAcquireCertificatePrivateKey( ACertContext,
                                            CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG,
                                            Nil,
                                            ProviderOrKeyHandle,
                                            dwKeySpec,
                                            pfCallerFreeProv) then begin

    //@@ - fabio
    gera_log_xml(1,'GetCertIsHardware- NFe',MsgErroGetCryptProvider,'','','','teste');

    raise EACBrDFeException.Create( MsgErroGetCryptProvider );

end;

Será que algum de vocês poderiam me ajudar a identificar o que pode estar havendo? 

Verifiquei que no diretorio windows\SysWOW64 a DLL CRYPT32.DLL está presente, assim como a ADVAPI32.dll tambem está.

Como o  @EMBarbosa havia sugerido  que deveria ser alguma permissão de acesso  que o serviço do windows não tem , que estava faltando, será que o  serviço  não acessa estas DLL ??

Se alguem tiver alguma ideia que eu possa utilizar por favor, me encaminhem.

Agradeço

@Fábio Eduardo de Souza

 

  

 

  • Consultores
Postado
Em 07/08/2017 at 14:28, Fábio Eduardo de Souza disse:

"O recipiente da chave não pôde ser aberto"

Pelo que olhei no código, essa mensagem é levantada quando é identificado o erro nte_bad_keyset.

Me parece que é a situação de não possuir permissão mesmo.

Em 07/08/2017 at 14:28, Fábio Eduardo de Souza disse:

será que o  serviço  não acessa estas DLL ??

Como disse, parece que não tem a ver com não ter acesso a DLL e sim não possuir permissão de acesso ao certificado.

Dei uma olhada no código e de acordo com a documentação da função CryptAcquireCertificatePrivateKey, ela só pode ser usada pelo owner da chave privada e não outro usuário. 

Então poderia verificar se o seu programa que é chamado pelo serviço roda no contexto do usuário que é owner do certificado?

links para futura referência:

https://blogs.msdn.microsoft.com/alejacma/2008/05/27/cryptacquirecontext-fails-with-nte_bad_keyset/

https://blogs.msdn.microsoft.com/alejacma/2008/12/23/cryptsignhash-fails-with-nte_bad_keyset/

  • Curtir 1
  • Obrigado 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.
  • Membros Pro
Postado

Boa dia, amigos @Daniel Simoes, @Juliomar Marchetti e @EMBarbosa  

Depois de muito tentar , não consegui fazer com que o Serviço lê-se o certificado A3 , pelo que vi é uma particularidade deste tipo de certificado.

Mas como tenho clientes que utilizam o A3 ,  decidimos alterar nossa aplicação, retirando ela do serviço do windows e criando um executavel que trabalha em background, deixando apenas um tryicon na barra de ferramentas.

Realizei todos os testes com os diferentes tipos de certificados e todos funcionaram perfeitamente. 

Agradeço o empenho e a atenção de voces mais uma vez.

Obrigado.

@Fábio Eduardo de Souza

 

  

  • Consultores
Postado

Pena que não foi o que queria Fábio. Mas que ótimo que resolveu.

Muito obrigado pelo retorno.

[]'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.
×
×
  • 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.