【问题标题】:Delphi XE7 Indy idHTTP client post error authorisingDelphi XE7 Indy idHTTP 客户端发布错误授权
【发布时间】:2020-01-29 07:50:53
【问题描述】:

我正在尝试使用 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 解决了这个问题。我是否需要获得更新版本的 Indy?

谢谢

艾伦

【问题讨论】:

  • ... 应替换为您要执行的 API 方法。
  • 我怀疑可能是这种情况。并试了一下。不用找了。结果相同。我开始认为文档有问题。

标签: api delphi authorization indy idhttp


【解决方案1】:

我收到的错误是“授权失败(这是我们的消息)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。

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

【讨论】:

  • 雷米 - 谢谢。我查找了在 XE7 上更新 Indy 所涉及的内容。不幸的是,正如您在另一个线程上所说的那样 - 它破坏了 Live Tile 组件。不幸的是,我不得不将其用于几个关键表格。我有 XE10.2,并将在接下来的一段时间内将所有内容迁移到该版本。我试过你的代码。我现在得到一个类似的错误 - 只有它现在读取“SSL23_GET_SERVER_HELLO”
  • 我使用foundeo.com/products/iis-weak-ssl-ciphers/… 检查了 SSL 状态。由于某种原因,所有尝试都超时。即使 ping URL 会导致回复。但是响应表明启用了 TSL1.1 和 1.2
  • 我注意到 IOHandler.SSLOptions.Method 一直默认为 sslvSSLv23。我应该覆盖它吗?
  • @AlanJeffery "我注意到 IOHandler.SSLOptions.Method 一直默认为 sslvSSLv23。我应该覆盖它吗?" - 不,这是预期的行为。 SSLv23 是一个通配符,可以动态协商多个 SSL/TLS 版本
  • 雷米。知道为什么会发生该错误吗?它似乎正在尝试协商连接。但是失败了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
相关资源
最近更新 更多