我希望在Delphi XE5中使用Indy的TIdHTTP
通过HTTPS阅读HTML页面。
ssleay32.dll
和libeay32.dll
位于主程序文件夹中。
我收到错误:SSL23_GET_SERVER_HELLO
。我该怎么做才能解决这个问题?
function get_page_text:string;
var
Response: String;
HTTPClient: TidHTTP;
const
url = 'https://www.lustundreiz.com/login';
begin
HTTPClient := TidHTTP.Create;
HTTPClient.AllowCookies := True;
HTTPClient.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
Response := HTTPClient.get(url);
HTTPClient.Free;
result := response;
end;
答案 0 :(得分:1)
当您未指定版本时TIdSSLIOHandlerSocketOpenSSL
使用的默认SSL / TLS版本是TLSv1,而不是SSLv23。因此,您收到SSL23错误是非常不寻常的。
现在许多现代Web服务器都需要TLS 1.1或更高版本,像SNI这样的TLS扩展等。因此,除了默认{sslvTLSv1_1
之外,请考虑在sslvTLSv1_2
属性中启用TIdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions
和sslvTLSv1
{1}}。并确保使用最新版本的Indy和OpenSSL DLL来支持这些版本。
您还应该将代码包装在try..finally
中,这样即使Free
引发异常,您也可以TIdHTTP
Get()
对象。
试试这个:
function get_page_text:string;
var
HTTPClient: TIdHTTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
const
url = 'https://www.lustundreiz.com/login';
begin
HTTPClient := TIdHTTP.Create;
try
HTTPClient.AllowCookies := True;
// set other HTTP properties as needed...
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTPClient);
SSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
// set other SSL properties as needed...
HTTPClient.IOHandler := SSL;
Result := HTTPClient.Get(url);
finally
HTTPClient.Free;
end;
end;
答案 1 :(得分:0)
好的,在我从Delphi XE5更新到Delphi XE10后,代码运行良好,没有任何错误。 感谢雷米的支持。