Indy 10.6.0.5169 + OpenSSL 1.0.2u + Delphi XE7,握手错误

Indy 10.6.0.5169 + OpenSSL 1.0.2u + Delphi XE7, handshake error

我想从使用 Indy 的网站获取数据,但它不起作用。 我收到以下错误:

Error connecting with SSL.
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

代码如下:

var
  AMS: TMemoryStream;
begin
  AMS := TMemoryStream.Create;
  try
    IdHTTP1.Get('https://www.optionsprofitcalculator.com/ajax/getStockPrice?stock=hca&reqId=0', AMS);
    AMS.SaveToFile('c:\test.txt');
  finally
    FreeAndNil(AMS);
  end;
end;

以及组件:

object IdHTTP1: TIdHTTP
  IOHandler = IdSSLIOHandlerSocketOpenSSL1
  AllowCookies = True
  HandleRedirects = True
  ProxyParams.BasicAuthentication = False
  ProxyParams.ProxyPort = 0
  Request.Connection = 'keep-alive'
  Request.ContentLength = -1
  Request.ContentRangeEnd = -1
  Request.ContentRangeStart = -1
  Request.ContentRangeInstanceLength = -1
  Request.Accept = 
    'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp' +
    ',*/*;q=0.8'
  Request.AcceptEncoding = 'gzip, deflate, br'
  Request.AcceptLanguage = 'hu-HU,hu;q=0.8,en-US;q=0.5,en;q=0.3'
  Request.BasicAuthentication = False
  Request.UserAgent = 
    'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:77.0) Gecko/20100101' +
    ' Firefox/77.0'
  Request.Ranges.Units = 'bytes'
  Request.Ranges = <>
  HTTPOptions = [hoForceEncodeParams]
  Left = 110
  Top = 155
end
object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL
  MaxLineAction = maException
  Port = 0
  DefaultPort = 0
  SSLOptions.Method = sslvSSLv23
  SSLOptions.SSLVersions = [sslvSSLv2, sslvSSLv3, sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2]
  SSLOptions.Mode = sslmUnassigned
  SSLOptions.VerifyMode = []
  SSLOptions.VerifyDepth = 0
  Left = 155
  Top = 155
end

我不知道问题出在哪里。如果用 Indy 无法实现,我想知道是否有任何标准的 Delphi 组件可以与 HTTPS 服务器通信?

根据 Remy Lebeau;

的建议

我正在使用 NetHttpClient。它使用操作系统的 SSL。如果您不必使用 Indy,则可以使用此组件。

var
   Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  try
   NetHTTPClient1.Get('https://www.optionsprofitcalculator.com/ajax/getStockPrice?stock=hca&reqId=0', Stream);
   Stream.SaveToFile('c:\test.txt');
  finally
    FreeAndNil(Stream)
  end;

你可以这样试试。我测试了它并且有效。

谜团解开了。

提到的站点使用 Indy 不支持的 TLS 1.3。

感谢Remy Lebeau,他在这次调查中帮助了我。