Handshake failure IdHTTP - Encapsular certificado digital

11/07/2018

0

Consegui obter resposta do webserve, mas ele está retornando o seguinte erro: 14094410: SSL routines: ssk3_read_bytes:sslv3 alert handshake failure.
Eu preciso encapsular um ceritificado digital junto a requisição e não sei como fazer isso, pelo que pesquisei preciso fazer algo com as propriedades da classe TIdSSLIOHandlerSocketOpenSSL, mas não sei como proceder.

egue o código que estou utilizando:

procedure TForm2.Button2Click(Sender: TObject);
var
str: TStringList;
strResp : TStringStream;
IdHTTP: TIdHTTP;
IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
str := TStringList.Create;
strResp := TStringStream.Create('');
IdHTTP := TIdHTTP.Create(nil);
IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1_2;
IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;
IdHTTP.Request.CustomHeaders.Clear;
IdHTTP.Request.CustomHeaders.AddValue('Role-Type','IMPEXP');
IdHTTP.Post('https://val.portalunico.siscomex.gov.br/portal/api/autenticar',str, strResp);
Memo1.Lines.Text := strResp.ToString;
end;
Marcio Almeida

Marcio Almeida

Responder

Posts

31/07/2018

Felipe Morais

MCastro,

Qual a versão do seu Indy? Este alerta é genérico e pode ter sido gerado por diversas razões. A primeira delas é que o peer pode estar requisitando TLS 1.1 ou superior e o default do Indy é TLS 1.0. Poderia ser isso(?) Tente alterar property SSLVersions do seu IOHandler e verifique.

A versão 10.5.7 do Indy já está bem defazada, então se o proposto acima não resolver, atualize seu Indy. Não sei qual atualização está agora, mas a partir da versão 10.6.2 do Indy o erro de HandShake SSL3 não acontece mais.

Exemplo para teste:

procedure TForm1.Button1Click(Sender: TObject);
var
  IdHTTP: TIdHTTP;
  URL, Str: string;
  SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
  URL := 'https://val.portalunico.siscomex.gov.br/portal/api/autenticar',str, strResp';
  Memo1.Lines.Clear;

  IdHTTP := TIdHTTP.Create(nil);
  try
    IdHttp.HandleRedirects := True;
    SSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
    try
      IdHTTP.IOHandler := SSL;
      Str := IdHTTP.Get(URL);
      Memo1.Text := Str;
    finally
      SSL.Free;
    end;
  finally
    IdHTTP.Free;
  end;
end;


Espero ter ajudado!
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar