delphi - 带有 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;
有谁知道如何解决这个问题?
解决方案
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 项:
推荐阅读
- flutter - iOS 应用程序在向后滑动手势时冻结约 0.5 秒
- python - 组合饼图和条形图 - Python Matplotlib
- java - 有什么方法可以在 Android Studio 上打开下载的 Play Store 应用程序?
- sql - 执行 LOWER() 时,ElasticSearch 查询导致错误“input_mismatch_exception”
- date - 创建与电子表格同步的日历,但所有事件都是在 1970 年 1 月 1 日 03:00 创建的。我错过了什么?
- python - 内联 Python 支持从 perl 传递文件句柄
- php - 如何从 If 语句中获取数组?
- c# - 将 Byte[] 从会话转换回列表
在c#中 - php - 如何阻止用户查看网站代码
- leaflet - Leaflet-routing-machine:如果航点已保存在某种数据存储中,有没有办法加载它们?