我正在尝试使用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解决了该问题。我可以得到印地语的最新版本吗?
感谢
艾伦
我得到的错误是“授权失败(这是我们的消息)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。