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,他在这次调查中帮助了我。
我想从使用 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,他在这次调查中帮助了我。