sslv3警报握手失败Delphi Indy

时间:2017-08-07 15:03:27

标签: delphi ssl indy

我一直在使用:

  • Delphi XE8

  • Indy版本10.6.2.5263

  • 预编译的开放SSL DLL文件(Win 32bit)v1.0.2.l

  • {li>

    TIdSSLIOHandlerSocketOpenSSL Method设置为sslvSSLv23

向服务器提交POST请求。它在很多个月里都像是一种魅力。

突然间,出现了一个疯狂的错误:

14094410 sslv3警报握手失败

一位同事正在使用SOAP UI通过强制TLS 1.2来针对同一服务器提交请求,并且它可以正常工作。我尝试将TIdSSLIOHandlerSocketOpenSSL1方法设置为sslvTLSv1_2,并将模式更改为sslmClient,但结果始终相同。

我认为通过将方法设置为sslvTLSv1_2,无法收到与SSLv3相关的错误。

我已检查过这些stackoverflow帖子:

以及其他一些主题,但我无法找到此问题的根本原因。

也许我错过了什么。你能给我一个提示吗?

3 个答案:

答案 0 :(得分:1)

有同样的问题,下面的源代码就像一个魅力。我从这个网站复制了这段代码,但我找不到归功于原始答案的链接。 请注意,源代码不是我的。

TCustomIdHTTP = class(TIdHTTP)
  public
    constructor Create(AOwner: TComponent);
  private
    procedure OnStatusInfoEx(ASender: TObject; const AsslSocket: PSSL; const AWhere, Aret: TIdC_INT; const AType, AMsg: String);
  end;

constructor TCustomIdHTTP.Create(AOwner: TComponent);
begin
  IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  with IOHandler as TIdSSLIOHandlerSocketOpenSSL do
  begin
    OnStatusInfoEx := Self.OnStatusInfoEx;
    SSLOptions.Method := sslvSSLv23;
    SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_1, sslvTLSv1];
  end;
  inherited Create(AOwner);
end;

procedure TCustomIdHTTP.OnStatusInfoEx(ASender: TObject; const AsslSocket: PSSL;
  const AWhere, Aret: TIdC_INT; const AType, AMsg: String);
begin
  SSL_set_tlsext_host_name(AsslSocket, Request.Host);
end;

答案 1 :(得分:0)

我自己也有一些网站遇到同样的问题。我使用TRESTClient代替TIdHTTPOpenSSL解决了这个问题。

  • TRESTClient
  • TRESTRequest
  • TRESTResponse

您可以在Delphi IDE的“工具”菜单中的REST调试器中设置URL,身份验证和参数,并将组件复制到剪贴板,以便您抢先一步。

答案 2 :(得分:0)

确保您的应用程序文件夹中有最新的libeay32.dll和ssleay32.dll