Ir para conteúdo
  • Cadastre-se

dev botao

Problema com certificado Remoteid


Ver Solução Respondido por Daniel Simoes,
  • Este tópico foi criado há 1304 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Moderadores
33 minutos atrás, carloscaloca disse:

Bom dia, estou testando o acbrnfe_exemplo com meu certificado RemoteId. Quando rodo no Delphi, gera as chaves certinho, mas quando rodo no Lazarus a chave fica diferente e o sefaz/rs retorna o erro 297. Podem me dar uma ajuda??

Obrigado

Não funciona, pois o mesmo não instala como exportável dentro do windows.

já fiz testes

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • Moderadores
2 horas atrás, carloscaloca disse:

Bom dia, estou testando o acbrnfe_exemplo com meu certificado RemoteId. Quando rodo no Delphi, gera as chaves certinho, mas quando rodo no Lazarus a chave fica diferente e o sefaz/rs retorna o erro 297. Podem me dar uma ajuda??

Obrigado

Ele consegue consultar status mas nào consegua assinar e enviar, ele dá erro

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

Sim, consegue consultar status. Parece algum problema na chave:

o primeiro em delphi e o outro em lazarus.

 

43200814620101000170650010000000151740249251-nfe.xml 43200814620101000170650010000000151040520823-nfe.xml

Eu achei o seguinte código em ACBrDFeWinCrypt linha 861:


  {$IfDef DELPHI2009_UP}
   StoreProvider := CERT_STORE_PROV_SYSTEM_W;
  {$ELSE}
   StoreProvider := CERT_STORE_PROV_SYSTEM_A;
  {$ENDIF};

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

Link para o comentário
Compartilhar em outros sites

  • Fundadores
2 horas atrás, Juliomar Marchetti disse:

veja a assinatura até cheio de AAAAA

Tem algum XML com a assinatura, mesmo que errada ?

3 horas atrás, carloscaloca disse:

Eu achei o seguinte código em ACBrDFeWinCrypt linha 861:

Isso é normal... o IFDEF é para carregar a versão ANSI ou WideString, conforme a IDE

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

  • Moderadores
3 horas atrás, carloscaloca disse:

Sim, consegue consultar status. Parece algum problema na chave:

o primeiro em delphi e o outro em lazarus.

 

43200814620101000170650010000000151740249251-nfe.xml 6 kB · 1 download 43200814620101000170650010000000151040520823-nfe.xml 7 kB · 2 downloads

Eu achei o seguinte código em ACBrDFeWinCrypt linha 861:


  {$IfDef DELPHI2009_UP}
   StoreProvider := CERT_STORE_PROV_SYSTEM_W;
  {$ELSE}
   StoreProvider := CERT_STORE_PROV_SYSTEM_A;
  {$ENDIF};

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

o segundo aqui Daniel.

 

5 minutos atrás, Daniel Simoes disse:

Tem algum XML com a assinatura, mesmo que errada ?

Isso é normal... o IFDEF é para carregar a versão ANSI ou WideString, conforme a IDE

 

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Por favor experimente o seguinte ajuste... isso fará o Lazarus também usar CERT_STORE_PROV_SYSTEM_W

  {$IfDef UNICODE}
   StoreProvider := CERT_STORE_PROV_SYSTEM_W;
  {$ELSE}
   StoreProvider := CERT_STORE_PROV_SYSTEM_A;
  {$ENDIF};    

 

  • 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

fiz a alteração mas gerou um erro, não achou o numero do certificado. Fiz outra depuração e achei um erro no seguinte código:

ACBrDFeWinCrypt

    1229     mBytesLen := Length(mHashBuffer);  // aqui, no delphi  o mHashBuffer tem tamanho de 256 e no Lazarus 1024

        if Assina then
        begin
          if CryptSignHash(mHash, dwKeySpec, Nil, 0, @mHashBuffer, mBytesLen ) then
          begin
            // MS CryptoAPI retorna assinatura em "Little Endian bit string", invertendo...
            Result := '';
            while (mBytesLen > 256) and (mHashBuffer[mBytesLen-1] = #0) do
              Dec(mBytesLen);

            for I := mBytesLen downto 1 do
              Result := Result + mHashBuffer[I-1];
          end  

 

Link para o comentário
Compartilhar em outros sites

  • Fundadores
1 hora atrás, carloscaloca disse:

    1229     mBytesLen := Length(mHashBuffer);  // aqui, no delphi  o mHashBuffer tem tamanho de 256 e no Lazarus 1024

O tamanho sempre será 1024.. veja como essa variável é declarada

mHashBuffer: array [0..1023] of AnsiChar;  // 1024 - Tamanho máximo do maior Hash atual

 

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

Depurei ao mesmo tempo com o delphi e o lazarus, a variavel é passada com 1024bytes, quando volta, no delphi ela tem Length(mHashBuffer) = 256bytes, testei varias vezes e no lazarus 1024. No delphi apartir da posição 256 vem cheio de   #0 e no lazarus ficam outros bytes. A função que busca a chave é a mesma, mas talves quando o Lazarus aponte pra o endereço da variavel coloque sujeira, como é feita a reversão, o lazarus não pega o valor correto da chave, eu acho. 

Link para o comentário
Compartilhar em outros sites

  • Fundadores

O Hash para esse tipo de algoritmo, sempre terá 256bytes... apenas o Buffer, onde ele é armazenado, tem 1024, para poder ser compatível com outros algoritmos....

o parâmetro mBytesLen, é passo por referência na chamada de  "CryptSignHash(mHash, dwKeySpec, Nil, 0, @mHashBuffer, mBytesLen )"

por isso que ele muda de valor, de acordo com o Hash gerado...  Observe ainda, que inclusive tem um código para remover os caracteres nulos do Buffer, caso o mBytesLen, seja informado de forma incorreta...

            while (mBytesLen > 256) and (mHashBuffer[mBytesLen-1] = #0) do
              Dec(mBytesLen);  

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

Eu nunca tive acesso a esse tipo certificado... se puder me enviar por M.P.... posso tentar fazer alguns testes e debugar...

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

Bom dia, descobri que quando o lazarus inicia o array mHashBuffer deveria ser preenchido #0, fiz uma pequena alteração e, pra mim, funcionou bem.

 

function TDFeWinCrypt.CalcHash(const AStream: TStream; const Digest: TSSLDgst;
  const Assina: Boolean): AnsiString;
var
  mCryptProvider, mCryptProviderCert: HCRYPTPROV;
  mHash, aHashType: HCRYPTHASH;
  hRSAKey, hSessKey, hExpKey: HCRYPTKEY;
  I: Integer;
  mTotal: Int64;
  mBytesLen, mRead, dwKeySpec, WinErro: DWORD;
  Memory: Pointer;
  mHashBuffer: array [0..1023] of AnsiChar;  // 1024 - Tamanho máximo do maior Hash atual
  pfCallerFreeProv: LongBool;
begin
  Result := '';
  FillChar(mHashBuffer,1024,0);  // alteração
  case Digest of
    dgstMD2    : aHashType := CALG_MD2;

 

Talvez seja necessário colocar algum diretriz para funcionar melhor.

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

  • Fundadores
  • Solution

Muito obrigado... enviei um ajuste ao SVN, baseado em suas sugestões...

Se for possível, por favor atualize e teste... Commit [r20553]

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

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