Delphi-7 的 Indy10 无法下载某些 SSL 页面,即使使用 2019 年 5 月的 DLL

Indy10 with Delphi-7 can't download some SSL pages, even with May 2019 DLLs

我正在开发一个旧的 Delphi 7 应用程序,它使用 Indy 10 下载网站。我在某些(并非全部)SSL 页面上遇到问题。

版本数据:

Indy 10

"libeay32.dll": 1.0.2.19 @ 31-May-19

"ssleay32.dll": 1.0.2.19 @ 31-May-19

当尝试使用 SSL 下载某些页面时(例如“https://davisashura.com/”),在 IdSSLOpenSSLHeaders 单元(版本 1.8)中,以下过程会引发指示的错误:

class procedure EIdOpenSSLAPISSLError.RaiseExceptionCode(const AErrCode, ARetCode: TIdC_INT; const AMsg: String);

初始化代码:

  HTTP := TIdHTTP.Create;

  with HTTP do begin
    Request.UserAgent := 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)';
    HandleRedirects := True;
    RedirectMaximum := 5;
    ReadTimeout := 20400;
  //Request.AcceptEncoding := 'text/html, deflate, gzip';  // some websites don't download with this set
    Compressor := TIdCompressorZLib.Create;
    IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    HTTPOptions := HTTPOptions + [hoForceEncodeParams, hoInProcessAuth];
  end;

有谁知道如何解决这个问题?

EOF 错误仅表示服务器在 TLS 握手期间关闭其套接字连接的末端,而没有先发回 TLS 警报。这意味着服务器不喜欢握手中的东西并且正在退出。最有可能的罪魁祸首是 TLS 版本。

默认情况下,TIdSSLIOHandlerSocketOpenSSL 仅启用 TLS 1.0,但如今许多网站都需要 TLS 1.1 或 1.2。您可以使用 TIdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions 属性 启用 TLS 1.1 和 1.2。

HTTP := TIdHTTP.Create;
HTTP.Request.UserAgent := 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)';
HTTP.HandleRedirects := True;
HTTP.RedirectMaximum := 5;
HTTP.ReadTimeout := 20400;
//HTTP.Request.AcceptEncoding := 'text/html, deflate, gzip'; // some websites don't download with this set
HTTP.Compressor := TIdCompressorZLib.Create(HTTP);
HTTP.HTTPOptions := HTTP.HTTPOptions + [hoForceEncodeParams, hoInProcessAuth];

SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
SSL SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2]; // <-- ADD THIS!
HTTP.IOHandler := SSL;

Indy 的问题跟踪器中有一个关于此问题的 TODO 项:

#181: Update TIdSSLIOHandlerSocketOpenSSL to enable TLS 1.1 and 1.2 by default