Delphi 11 TIdHTTP.Get 结果无法加载 SSL 库

Mik*_*kup 1 delphi indy delphi-11-alexandria

在一个空白的 Delphi 11 项目中,我放置了一个按钮和一个 TIdHTTP 组件。

该按钮尝试获取 .txt 文件。

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TMemoryStream;

begin
  Stream := TMemoryStream.Create;

    try

      IdHTTPGetProgramUpdateFile.Get('https://www.bookup.com/cowupdates/build129.txt', 
                                     Stream);

    except

      on E: Exception do
        begin
          MessageDlg(E.Message,
                     TMsgDlgType.mtInformation,
                     [TMsgDlgBtn.mbOK],
                     E.HelpContext);
        end;
    end;

  Stream.SaveToFile('downloaded.txt');

  Stream.Free;
end;
Run Code Online (Sandbox Code Playgroud)

如果 Windows 项目请求带有 https 的 URL,则错误为“无法加载 SSL 库”。

如果 Windows 或 Macintosh 上的项目请求带有 http 的 URL,则错误为“301 Moved Permanently”。(该文件位于网站上。)

如果该项目在带有 https 的 Macintosh 上运行,则 PAServer 会报告该项目“正在以不​​安全的方式加载 libcrypto”。

IdSSLOpenSSL.pas在 Windows 上运行时,该项目会在源代码注释中抛出异常:

这里的异常可能意味着您使用了错误版本的 openssl 库。请参阅该文件顶部的注释。

文件顶部的注释对我来说没有用。

我正在尝试从网站下载文本文件的内容,但我对互联网协议知之甚少。我缺少什么?

Rem*_*eau 5

如果 Windows 项目请求带有 https 的 URL,则错误为“无法加载 SSL 库”。

您依赖于TIdHTTP使用 Indy 的默认TIdSSLIOHandlerSocketOpenSSL组件,该组件依赖于 OpenSSL 1.0.2 库文件(即libeay32.dllssleay32.dll等),因此请确保使用您的应用程序部署这些文件,最好是在应用程序的安装文件夹中。或者,如果需要,Indy 确实有一个IdOpenSSLSetLibPath()函数,您可以在应用程序启动时调用该函数来指定库所在的备用文件夹路径。

如果 Windows 或 Macintosh 上的项目请求带有 http 的 URL,则错误为“301 Moved Permanently”。(该文件位于网站上。)

301是一个重定向响应。服务器告诉您,您请求的 URL 是旧的,并且资源可以在不同的 URL 上使用(在这种情况下,它可能会将您重定向到 HTTPS url),该资源将在属性中提供给您TIdHTTP.Response.Location,并且在事件TIdHTTP.OnRedirect

如果您已TIdHTTP.HandleRedirects设置truefalse默认情况下),则会TIdHTTP自动为您重新请求新的 URL。否则,它会将其视为301错误条件,并且您必须自己手动请求新的 URL。

如果该项目在带有 https 的 Macintosh 上运行,则 PAServer 会报告该项目“正在以不​​安全的方式加载 libcrypto”。

默认情况下,在基于 Nix 的系统上,Indy 尝试使用未版本化的符号链接加载 OpenSSL 库文件,如果失败,则会转而加载特定版本化的库文件。使用符号链接并不安全,因为它们可能映射到您不期望的库版本。例如,在现代系统上,OpenSSL 无版本控制的符号链接可能会映射到 OpenSSL 1.1.x 或更高版本的库文件,而该版本TIdSSLIOHandlerSocketOpenSSL不支持(请改用此 SSLIOHandler)。Indy 具有您可以在应用程序启动时IdOpenSSLSetCanLoadSymLinks()调用IdOpenSSLSetLoadSymLinksFirst()的函数,以防止 Indy 尝试加载符号链接。然后,您可以使用您的应用程序部署特定版本的库文件,或将 Indy 指向它们所在的文件夹。

IdSSLOpenSSL.pas在 Windows 上运行时,该项目会在源代码注释中抛出异常:

这里的异常可能意味着您使用了错误版本的 openssl 库。请参阅该文件顶部的注释。

文件顶部的注释对我来说没有用。

发生错误后,您可以使用 Indy 的WhichFailedToLoad()函数来查明 Indy 加载 OpenSSL 失败是否是因为库文件失败或加载,或者缺少所需的函数导出。