Delphi XE7 Indy idHTTP клиент пишет сообщение об ошибке авторизации - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь подключиться к онлайн-API с помощью Indy HTTP-клиента. Я получаю сообщение об ошибке: «Авторизация не удалась (это наше сообщение). EIdOSSLUnderlyingcryptoerror Ошибка соединения с SSL, ошибка: 14094410: ssl ROUTINES: SSL3_READ_BYTES: сбой квитирования оповещения SSLV3.»

Идентификатор idSSLIOHandler устанавливается в режиме какsslmClient.

`procedure TOnLineSettingsForm.Button5Click(Sender : TObject);
var
S: TStringStream;
R : TStringStream;
sTest : String;
sResponse : String;
sAuthCode : AnsiString;
begin
//S := TStringList.Create;
R := TStringStream.Create;
if Length(edCert.Text) <> 0 then
begin
   try
     try
        sAuthCode := 'AUTHORISATION:' + edCert.Text;
        S := TStringStream.Create('AUTHORISATION:' + edCert.Text,   TEncoding.UTF8);
        S.Position := 0;
        with IdHTTP1 do
        begin
           IOHandler := IdSSLIOHandlerSocketOpenSSL1;
           Post('https://api.cloudwaitress.com/V1/...', S); //  sAuthCode);
           sResponse := ResponseText;
        end;
        sTest := R.DataString;
     except
        on e:exception do
        begin
           Showmessage('Authorisation failed....' + e.ClassName + ' ' + e.Message);
           sTest := R.DataString;
        end;
     end;
  finally
     s.Free;
     R.Free;
  end;
end else
begin
   Beep;
  Beep;
  ShowMessage('Please enter the id code.');
end;
end;`

В документации говорится, что для аутентификации требуется следующее:

curl https://api.cloudwaitress.com/v1/... -H "Авторизация: YOUR_API_KEY"

Я был обеспокоен тем, что«...» в конце URL-адреса будет недействительным, поэтому я пропустил его. Получил ошибку, так что отложите ее обратно. Та же ошибка. Так что, я подозреваю, проблема в другом. Я отмечаю, что авторизация не включает ничего о типе контента. Хотя другие запросы для этого API требуют и требуют "application / json".

Возможно ли сбой рукопожатия просто означает, что соединение API недействительно?

Извините - следовало сказать -Версия Indy - 10.6.1.5182. Я отмечаю, что та же самая ошибка может быть вызвана, если TLS требуется на сервере. И эта Indy 10.6.2 исправила эту проблему. Могу ли я получить более свежую версию Indy?

Спасибо

Алан

1 Ответ

0 голосов
/ 30 сентября 2019

Ошибка, которую я получаю: «Авторизация не удалась (это наше сообщение) EIdOSSLUnderlyingcryptoerror Ошибка соединения с SSL, ошибка: 14094410: ssl ROUTINES: SSL3_READ_BYTES: сбой квитирования оповещения SSLV3."

EIdOSSLUnderlyingCryptoError не имеет никакого отношения к самому HTTP, это ошибка библиотеки шифрования. В этом случае говорится, что рукопожатие SSL / TLS не проходит, прежде чем HTTP-запрос может быть отправлен по соединению. Например, это может произойти, если для API требуется TLS v1.1 +, поскольку TIdSSLIOHandlerSocketOpenSSL по умолчанию используется только TLS v1.0, но вы можете вручную включить TLS v1.1 и v1.2 в свойстве SSLIOHandler SSLOptions.SSLVersions.

Кроме того, поток сообщений - это неправильное место для отправки заголовка HTTP Authorization.

Попробуйте это:

procedure TOnLineSettingsForm.Button5Click(Sender : TObject);
var
  S: TStringStream;
  sResponse : String;
begin
  if edCert.GetTextLen > 0 then
  begin
    try
      S := TStringStream.Create('...', TEncoding.UTF8);
      try
        IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
        IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
        IdHTTP1.Request.CustomHeaders.Values['Authorization'] := edCert.Text;
        sResponse := IdHTTP1.Post('https://api.cloudwaitress.com/V1/...', S);
      finally
        S.Free;
      end;
    except
      on E: Exception do
      begin
        ShowMessage('Error.... ' + e.ClassName + ' ' + e.Message);
      end;
    end;
  end else
  begin
    Beep;
    Beep;
    ShowMessage('Please enter the id code.');
  end;
end;

Версия Indy - 10,6. 1.5182 ... Indy 10.6.2 исправил эту проблему. Может быть, мне нужно получить более свежую версию Indy?

Устраняет ли она проблему или нет, 10.6.1 очень старая, поэтому вам все равно придется обновиться. На момент написания этой статьи текущей версией является 10.6.2.5518.

...