首页 > 解决方案 > 带有 Delphi-7 的 Indy10 无法下载某些 SSL 页面,即使使用 2019 年 5 月的 DLL

问题描述

我正在开发一个使用 Indy 10 下载网站的旧 Delphi 7 应用程序。我在处理一些(不是全部)SSL 页面时遇到了困难。

版本数据:

印地 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;

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

标签: delphiopenssldelphi-7indyindy10

解决方案


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: 更新 TIdSSLIOHandlerSocketOpenSSL 以默认启用 TLS 1.1 和 1.2


推荐阅读