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

标签 delphi openssl delphi-7 indy indy10

我正在开发一个旧的 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 单元(Rev. 1.8)中,以下过程会引发指示的错误:

类过程 EIdOpenSSLAPISSLError.RaiseExceptionCode(const AErrCode, ARetCode: TIdC_INT; const AMsg: String); enter image description here

初始化代码:

  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

关于delphi - 使用 Delphi-7 的 Indy10 无法下载某些 SSL 页面,即使使用 2019 年 5 月的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57655844/

相关文章:

delphi - 为整个 Delphi 应用程序设置ThreadLocale

c++ - OpenSSL 配置最大连接数

delphi - 为了防止 Delphi 损坏 .DPR 中的使用列表和 {$*.RES},不应该做什么

.net - Delphi : How to call the .Net 4.0 版本的 StrongNameSignatureVerificationEx

mysql - Delphi Firemonkey XE8 - 如何使用 DataSnap 正确发送/接收图像

delphi - Delphi中如何响应对象属性字段的变化

delphi - 使用delphi检测USB驱动器/设备

python - Python 和 Ruby 之间的匹配签名

windows - 如何计算在windows批处理中编码的sha1 base64?

sql - 获取当前月份的日期范围?