【问题标题】:sslv3 alert handshake failure Delphi Indysslv3 警报握手失败 Delphi Indy
【发布时间】:2017-08-07 15:03:27
【问题描述】:

我一直在使用:

  • 德尔福 XE8

  • 印地版 10.6.2.5263

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

  • TIdSSLIOHandlerSocketOpenSSL Method 设置为 sslvSSLv23

向服务器提交 POST 请求。几个月来,它就像一种魅力。

突然,一个疯狂的错误弹出:

14094410 sslv3 警报握手失败

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

我认为通过将Method设置为sslvTLSv1_2,不可能收到与SSLv3相关的错误。

我已经查看了这些 stackoverflow 帖子:

和其他一些线程,但我无法找到此问题的根本原因。

也许我错过了什么。能不能给个提示?

【问题讨论】:

  • TLS 是 SSL 3.0 的扩展,OpenSSL 使用 SSLv3 功能来实现 TLS,这就是警报显示 SSLv3 的原因。但是如果没有关于警报实际内容的具体细节,尤其是警报编号,就无法知道 OpenSSL 失败的原因。还有,你的 Indy 有点老了,当前版本是 10.6.2.5432,你应该考虑升级一下,这样你就有最新的 OpenSSL 支持代码了。
  • 你好 Remy,确切的错误是:error:14094410:SSLroutines:ssl3_read_bytes:sslv3 警报握手失败。我会尝试获取最新的 Indy 版本,然后再试一次。
  • 您好,我已经更新了 Indy 组件,但是现在显示的版本是 10.6.2.0。
  • 您是直接从 SVN 下载的,还是从 Fulgan 下载的 nightly zip? Zip 的版本号正确。
  • 你好 Remy,我用 Wireshark 和一些 Java 代码做了一些测试。 Wireshark 透露,Indy 组件总是发送 TLSv1 请求——无论我通过 SSLOptions.Method 或 SSLOptions.SSLVersions 选择什么。 java代码请求使用TLSv1.2,请求成功。所以我的问题是,indy 组件总是发送 TLSv1

标签: delphi ssl indy


【解决方案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;

【讨论】:

  • 请注意,你需要IdCTypesIdSSLOpenSSLHeaders在使用中......(我不得不挖掘这些)
【解决方案2】:

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

【讨论】:

  • 以前 - 我试过你发布的解决方案,效果很好
【解决方案3】:

我自己在某些网站上也遇到过同样的问题。我通过使用TRESTClient 而不是TIdHTTPOpenSSL 解决了这个问题。

  • TRESTClient
  • TRESTRequest
  • TRESTResponse

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

【讨论】:

  • 一开始这是我的解决方案,但后来是获取二进制数据的部分,在这种情况下TRESTClient不知道如何处理二进制数据...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 2016-07-03
  • 2015-12-06
  • 1970-01-01
  • 2021-02-20
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多