无法使用Delphi打开Https TSL页面 - Indy错误:SSL23_GET_SERVER_HELLO

时间:2018-01-25 18:54:37

标签: delphi ssl https indy delphi-xe5

我希望在Delphi XE5中使用Indy的TIdHTTP通过HTTPS阅读HTML页面。

ssleay32.dlllibeay32.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;

2 个答案:

答案 0 :(得分:1)

当您未指定版本时TIdSSLIOHandlerSocketOpenSSL使用的默认SSL / TLS版本是TLSv1,而不是SSLv23。因此,您收到SSL23错误是非常不寻常的。

现在许多现代Web服务器都需要TLS 1.1或更高版本,像SNI这样的TLS扩展等。因此,除了默认{sslvTLSv1_1之外,请考虑在sslvTLSv1_2属性中启用TIdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersionssslvTLSv1 {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后,代码运行良好,没有任何错误。 感谢雷米的支持。