代码之家  ›  专栏  ›  技术社区  ›  delphirules

tidthttp:无法在非https URL上加载SSL库

  •  -1
  • delphirules  · 技术社区  · 6 年前

    我正在使用tidthttp从非https URL下载zip文件,如下面的代码:

    IdHTTPProgress.DownloadFile('http://www.myurl.com/myfile.zip','c:\myfile.zip');
    

    不过,我得到了一个异常“无法加载SSL库”。例外情况会发生,但之后无论如何都会进行下载。

    我怎样才能避免这个例外呢?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   Remy Lebeau    6 年前

    唯一可能发生异常的方法是:

    • 您已分配 TIdSSLIOHandlerSocketOpenSSL 组件到 TIdHTTP.IOHandler 财产。

      它将尝试初始化openssl,即使您正在发出HTTP请求,因为任何HTTP请求都有可能重定向到HTTPS,因此indy在建立TCP连接时准备openssl,以防万一。

    • 您尚未部署OpenSSL DLL( libeay32.dll ssleay32.dll 或与您的目标平台相同)的应用程序-或-您已部署 错误的 与您的indy版本不兼容的dll版本。

      如果你要用 Tidssliohandlersocketopenssl ,您需要合适的DLL。Indy目前最多支持openssl 1.0.2,但不支持openssl 1.1.0或更高版本 on the TODO list )

    当Indy引发“无法加载SSL库”异常时,可以调用Indy的 WhichFailedToLoad() 功能在 IdSSLOpenSSLHeaders 找出故障是因为DLL未能加载到内存,还是因为DLL缺少INDY所需的导出。

    还有一个 OpenSSLVersion() 功能在 IdSSLOpenSSL 报告已加载到内存中的OpenSSL版本的单元。

    在您的情况下,不会发生从HTTP到HTTPS的重定向,但错误仍然在内部发生,这是 TIdHTTP 燕子,因为没有使用HTTPS。您的代码在运行时将看不到异常。但您的调试器会。