Delphi XE7 Indy idHTTP客户端发布错误授权

问题描述 投票:0回答:1

我正在尝试使用Indy HTTP客户端连接到在线API。我收到的错误是“授权失败(这是我们的消息)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;`

文档说必须进行以下认证

卷曲https://api.cloudwaitress.com/v1/ ...-H“授权:YOUR_API_KEY”

我担心网址末尾的“ ...”无效,因此我将其省略。发现错误,请放回原处。同样的错误。因此,我怀疑问题出在其他方面。我注意到授权不包含任何有关内容类型的内容。尽管对此API的其他请求也需要“ application / json”。

握手失败可能仅表示API连接无效吗?

[抱歉-应该说-Indy版本是10.6.1.5182。我注意到,如果服务器上需要TLS,则可以触发相同的错误。而Indy 10.6.2解决了该问题。我可以得到印地语的最新版本吗?

感谢

艾伦

api delphi authorization indy idhttp
1个回答
0
投票

我得到的错误是“授权失败(这是我们的消息)EIdOSSLUnderlyingcryptoerror与SSL连接时出现错误,错误:14094410:ssl ROUTINES:SSL3_READ_BYTES:SSLV3警报握手失败。”

EIdOSSLUnderlyingCryptoError与HTTP本身无关,这是一个加密库错误。在这种情况下,就是说SSL / TLS握手失败,然后才能通过连接发送HTTP请求。例如,如果API需要TLS v1.1 +,则可能会发生这种情况,因为TIdSSLIOHandlerSocketOpenSSL仅默认为TLS v1.0,但是您可以在SSLIOHandler的SSLOptions.SSLVersions属性中手动启用TLS v1.1和v1.2。 >

此外,帖子流是发送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。

© www.soinside.com 2019 - 2024. All rights reserved.