【问题标题】:How to correctly make Indy TIdHttp use SSL libraries from a specific folder?如何正确使 Indy TIdHttp 使用特定文件夹中的 SSL 库?
【发布时间】:2019-10-12 06:41:43
【问题描述】:

我成功地使用 Indy 的 TIdHttp(版本 10 和 Delphi 2009)使用下面的代码通过 https 发送数据

var
  HttpClient: TIdHttp;
  IdSSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
  FormData : TIdMultiPartFormDataStream;

begin
  FormData := TIdMultiPartFormDataStream.Create;
  HttpClient:= TIdHttp.Create;
  IdSSLIOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create;
  HttpClient.IOHandler := IdSSLIOHandler;
  ...
  <the rest of the code that uses HttpClient in the normal way> 
  ...

但是,这似乎仅在 SSL 文件 libeay32.dllssleay32.dll 与我的 exe 位于同一文件夹中时才有效。我需要从 ProgramData 子文件夹中加载它们。

如果我从 exe 的文件夹中复制 libeay32.dllssleay32.dll 并将它们放在文件夹 C:\ProgramData\CommonData\ 中,然后使用 IdOpenSSLSetLibPath 设置 SSL 路径(见下文),我会收到一个错误,说它无法加载SLL 库。

var
  HttpClient: TIdHttp;
  IdSSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
  FormData : TIdMultiPartFormDataStream;

begin
  FormData := TIdMultiPartFormDataStream.Create;
  HttpClient:= TIdHttp.Create;
  IdSSLIOHandler:= TIdSSLIOHandlerSocketOpenSSL.Create;
  IdOpenSSLSetLibPath('C:\ProgramData\CommonData');  //set path to libeay32.dll and  ssleay32.dll
  HttpClient.IOHandler := IdSSLIOHandler;
   ...
  <the rest of the code that uses HttpClient in the normal way> 
  ...

在异常处理程序中使用showmessage(whichfailedtoload ) 似乎可以确认是C:\ProgramData\CommonData\libeay32.dll 是第一个加载失败的。所以 Indy 正在寻找应该找到相同文件的正确位置。

我不知道我是否应该在创建 HttpClient 之前或之后,或者在分配 IdSSLIOHandler 之前或之后调用IdOpenSSLSetLibPath,但无论如何它似乎并没有太大区别。

我查看了这些帖子 herehere 以及论坛帖子 here

谁能告诉我为什么相同的 SSL 库在 exe 文件夹中加载并正常工作,但在使用 IdOpenSSLSetLibPath 分配的 ProgramData 子文件夹中时却没有? - 更好的是如何使它工作!

顺便说一句,我什至使用了二进制文件比较实用程序来确保两个位置的 SSL 文件是相同的,并且还使用 PE 来确保它确实在使用 exe 文件夹中的 DLL 而不是来自其他地方。

【问题讨论】:

    标签: http ssl indy


    【解决方案1】:

    我相信我已经找到了答案。我来自的 SSL 文件 openssl-1.0.0j-win32-vc.zip。当我再次尝试使用从https://indy.fulgan.com/SSL/ 下载的 openssl-1.0.2r-i386-win32.zip 时,当文件位于 ProgramData 子文件夹中时,它可以正常工作。因此,看起来 1.0.0j 文件可能包含与 1.0.2r 没有的其他文件的某种依赖关系。

    虽然这并不容易,尽管在一些 SO 帖子中提到了用于下载的 fulgan 站点,好像我们应该知道它很明显,但并非所有帖子都提到它,有些只是说“获取最新的”库。试图找出哪些是最新的以及它们在哪里是相当困难的。即使是 fulgan 网站也有 1.0.2r 和 1.0.2q 并且没有迹象表明哪个是最新的(除非字母是某种字母版本号)

    【讨论】:

    • "所以看起来 1.0.0j 文件可能包含与 1.0.2r 没有的其他文件的某种依赖关系。" - 使用 Dependency Walker工具来验证。大多数 OpenSSL 发行版都依赖于 MSVC++ 运行时。富尔根分布没有。 “除非字母是某种按字母顺序排列的版本号”——实际上就是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2017-07-08
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多