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á 1550 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

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

  • Moderadores
Postado
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_Transparent-02.png
 

 

  • Moderadores
Postado
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_Transparent-02.png
 

 

Postado

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 ) );      

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

  • Moderadores
Postado
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_Transparent-02.png
 

 

Postado (editado)

O que fiz: 

Rodei o ACBrNFe_Exemplo no delphi e lazarus fui depurando, passo a passo. Até a linha 862, como relatado, estava tudo igual. Apartir daí gerou o erro dos AAAAA.

 

 

Editado por carloscaloca
  • Fundadores
Postado

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.

Postado

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  

 

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

Postado

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. 

  • Fundadores
Postado

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.

Postado

sim, verifiquei isso, porem, quando ele vai para a rotina mais abaixo, o valor mBytesLen está errado no lazarus, ele deveria ser  256 mas está com 1024. amanhã farei outro teste e informo. 

Postado

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