我有一个用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的旧版本还是?
答案 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为止。