【问题标题】:TIdSSLIOHandlerSocketOpenSSL and TLS protocolTIdSSLIOHandlerSocketOpenSSL 和 TLS 协议
【发布时间】:2019-02-19 22:25:18
【问题描述】:

我有一个用 XE2 开发的 Windows 桌面应用程序,它从远程服务器以 JSON 格式提取数据。我使用 Indy 10 来管理这个。

在我收到来自服务器提供商人员的电子邮件之前,该应用程序运行良好:

“...保护通信安全的唯一协议是 TLS 1.2。旧版本(TLS.1.0、TLS.1.1 或 SSLv3)将不再有效。” 他们建议使用 TLS 1.2 或更高版本。

从那以后我有以下运行时错误

第一次机会例外,$7518845D。异常类 EIdOSSLUnderlyingCryptoError 带有消息“与 SSL 连接时出错。 使用 SSL 连接时出错。错误:1408F10B:SSL 例程:SSL3_GET_RECORD:错误的版本号。

我发现调用FidHTTP.Post时会触发错误(FidHTTP是TidHTTP的一个实例)。

我已通过以下方式修改了创建类的方法:

constructor TMyClass.Create;

begin
  FidHTTP := TidHTTP.Create(nil);
  FidHTTP.HTTPOptions := FidHTTP.HTTPOptions - [hoForceEncodeParams];
  FidHTTP.Intercept := TIdLogFile.Create(FidHTTP);

  TIdLogFile(FidHTTP.Intercept).Filename := 'c:\'+s+'.log';
  TIdLogFile(FidHTTP.Intercept).Active := true;
  {$IFDEF VER230}
  FIdSSL := TIdSSLIOHandlerSocketOpenSSL.Create;
  FIdSSL.SSLOptions.Method:=sslvTLSv1; // I have added this line
  {$ENDIF}
end;

但现在我有另一个错误:

第一次机会例外,$7518845D。异常类 EIdSocketError 带有消息“Socket Error #10054 Connection reset by peer.”。

我已经用谷歌搜索了这个,但我只找到了有关 FTP 的信息,这不是我的情况。

我做错了什么?是因为我有一个没有 sslvTLSv1_2 选项的旧版本的 Indy 还是?

【问题讨论】:

    标签: delphi ssl indy


    【解决方案1】:

    sslvTLSv1 仅适用于 TLS v1.0。要使用 TLS v1.2,您需要改用sslvTLSv1_2

    FIdSSL.SSLOptions.Method := sslvTLSv1_2;
    

    或者:

    FIdSSL.SSLOptions.SSLVersions := [sslvTLSv1_2];
    

    如果您的 Indy 版本没有 sslvTLSv1_2,那么您将不得不升级。当前的 Indy 版本是 v10.6.2.5494。

    另外,请确保您使用的至少是 OpenSSL v1.0.1,该版本首先添加了对 TLS v1.2 的支持。 Indy 10 支持的 OpenSSL 最新版本是 v1.0.2。

    此外,您需要从代码中删除 {$IFDEF VER230}。这将您的代码限制为仅在专门为 XE2 编译时创建 TIdSSLIOHandlerSocketOpenSSL。默认情况下,TIdSSLIOHandlerSocketOpenSSL 仅启用 TLS v1.0,因此您必须更改代码以始终无条件地创建 TIdSSLIOHandlerSocketOpenSSL 以启用 TLS v1.2,无论使用的编译器版本如何(至少在 this ticket 之前)已实施)。

    【讨论】:

    • 我正在查看有关如何更新的 Indy 页面,在注释中我可以看到:“删除所有现有的二进制文件 - IndySystemX0.*、(dcl)IndyCoreX0.* 和 (dcl) IndyProtocolsX0.*" 这是否意味着我必须删除所有文件 IndySystem??0.* dclIndyCore??0.* 和 dclIndyProtocols??0.* "请务必检查 IDE 的 \bin、\lib 和 \源文件夹、\Indy 子文件夹和 OS 系统文件夹。”这到底是什么意思?我应该在哪里检查 IDE?
    • 最后我自己想通了。供大家参考,对于 XE2: - IndySystemX0.* 代表 IndySystem160 - (dcl)IndyProtocolsX0.* 代表 IndyProtocols160.* 和 (dcl)IndyProtocols160.* - (dcl)IndyCoreX0.* 代表 IndyCore160.* 和 dclIndyCore160.*
    猜你喜欢
    • 2018-11-26
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多