Ir para conteúdo
  • Cadastre-se

Recommended Posts

Postado

Resolvi postar a sequencia de correçao que fiz, aqui e  depois verifico e submeto código para revisão e inclusão:

 

 

Achei a causa raiz. Confirmando: sim, `uExemploEsocial.pas` é o responsável pela config do certificado — e é lá que está o bug.

## Diagnóstico

Em `TFExemploEsocial.LerConfiguracao` (uExemploEsocial.pas):

**Linha 927-933** — força `cbSSLLib` para índice 4 (`libWinCrypt`), ignorando o que está salvo:
```pascal
IF (cbSSLLib.Items.Count>0) then begin
   cbSSLLib.ItemIndex := 0;
   IF (cbSSLLib.Items.Count>3) then begin // WinCrypt
      cbSSLLib.ItemIndex := 4;
   end;
end;
```

**Linhas 936-939** — a leitura real de `SSLLib`/`CryptLib`/`HttpLib`/`XmlSignLib` do INI está **comentada** (bloco `{ }`):
```pascal
{
    cbSSLLib.ItemIndex := Ini.ReadInteger('Certificado', 'SSLLib', 0);
    cbCryptLib.ItemIndex := Ini.ReadInteger('Certificado', 'CryptLib', 0);
    cbHttpLib.ItemIndex := Ini.ReadInteger('Certificado', 'HttpLib', 0);
    cbXmlSignLib.ItemIndex := Ini.ReadInteger('Certificado', 'XmlSignLib', 0);
}
```

Resultado: `cbCryptLib`, `cbHttpLib` e `cbXmlSignLib` nunca são atualizados e ficam com o valor default do `FormCreate` (`ItemIndex := 0`).

Depois, nas linhas 1025-1027, esses índices zerados são aplicados direto:
```pascal
SSLCryptLib := TSSLCryptLib(cbCryptLib.ItemIndex);     // 0 = cryNone
SSLHttpLib := TSSLHttpLib(cbHttpLib.ItemIndex);         // 0 = httpNone
SSLXmlSignLib := TSSLXmlSignLib(cbXmlSignLib.ItemIndex); // 0 = xsNone
```

Conferi no fonte do ACBr (`ACBrDFeSSL.pas`, `SetSSLCryptLib`/`SetSSLHttpLib`/`SetSSLXmlSignLib`): quando o valor é `cryNone`/`httpNone`/`xsNone`, cai no `else` e instancia uma classe **genérica/vazia** (`TDFeSSLCryptClass`, `TDFeSSLHttpClass`, `TDFeSSLXmlSignClass`), que não implementa nada de verdade.

**Ou seja:** `SSLLib` fica em `libWinCrypt` (correto para A3), mas `SSLCryptLib`/`SSLHttpLib`/`SSLXmlSignLib` ficam em classes vazias que não sabem conversar com o CryptoAPI/token. Por isso o Windows nunca chega a pedir o PIN do A3, e o ACBr estoura um erro genérico de "provedor" — porque a camada de assinatura configurada não tem implementação real.

## Correção sugerida

Em vez de reativar a leitura do INI (que nunca teve esses valores salvos, já que a gravação também está incompleta), o mais robusto é forçar os 4 índices de forma consistente com WinCrypt, junto do bloco que já força `cbSSLLib`:

```pascal
cbCryptLib.ItemIndex   := Ord(cryWinCrypt);      // 3
cbHttpLib.ItemIndex    := Ord(httpWinHttp);      // 2
cbXmlSignLib.ItemIndex := Ord(xsMsXmlCapicom);   // 3 (ou xsMsXml = 2, se CAPICOM não estiver instalado)
``

  • Consultores
Postado

Mas e como está sendo feito no seu sistema?

 

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
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 !!

Postado

Eu uso como no aplicativo de exemplo do eSocial Delphi da propria ACBr, apenas havia uma falha que fazia o aplicativo nao utilizar as 4 configuracoes da WinCrypt


 

procedure TFExemploEsocial.LerConfiguracao;
var
  IniFile, PathMensal: String;
  Ini: TIniFile;
begin
  IniFile := mClssBDPrincipal.CaminhoBancoDeDados+'eSocial\MGP_eSocial.ini';
  Ini := TIniFile.Create(IniFile);

  try
      IF (cbSSLLib.Items.Count>0) then begin
         cbSSLLib.ItemIndex := 0;
         IF (cbSSLLib.Items.Count>3) then begin // WinCrypt
            cbSSLLib.ItemIndex := 4;
         end;
      end;

=======================>
      cbCryptLib.ItemIndex   := Ord(cryWinCrypt);
      cbHttpLib.ItemIndex    := Ord(httpWinHttp);
      cbXmlSignLib.ItemIndex := Ord(xsMsXmlCapicom);


 

Postado


Ou seja: em meu programa eu lia as configuracoes de meu arquivo config, com os protocolos utilizados, os dados do certificados mas por erro na sequencia dos procedimentos, `SSLLib` ficava em `libWinCrypt` (correto para A3), mas `SSLCryptLib`/`SSLHttpLib`/`SSLXmlSignLib` ficavam em classes vazias que não sabiam conversar com o CryptoAPI/token. Por isso o Windows nunca chegava a pedir o PIN do A3, e o ACBr estourava um erro genérico de "provedor" — porque a camada de assinatura configurada não tinha implementação real,. Eu havia inserido código para forçar libWinCript em meus programas, porem deixei falhas que não definiam corretamente os 4 ComboBox do protocolo e isso afetava as variaveis, identificando, colocando como comentario o código falho e definindo os ItemIndex como o codigo acima fez funcionar, o que importa é se certificar que o protocolo esteja corretamente definido para os 4.

No meu caso defini:

      cbSSLLib.ItemIndex := 4;
      cbCryptLib.ItemIndex   := Ord(cryWinCrypt);
      cbHttpLib.ItemIndex    := Ord(httpWinHttp);
      cbXmlSignLib.ItemIndex := Ord(xsMsXmlCapicom);

  • Consultores
Postado

certo

no caso estáok em seu sistema para assinar com A3 isso?

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
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 !!

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.

The popup will be closed in 10 segundos...