TIdSSLIOHandlerSocketOpenSSL和TLS协议

时间:2019-02-19 22:25:19

标签: delphi ssl indy

我有一个用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   并显示消息“套接字错误#10054对等方重置了连接”。

我已经在Google上进行了搜索,但是我发现的信息仅与FTP有关,而与我无关。

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

1 个答案:

答案 0 :(得分:4)

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为止。