17

我正在尝试连接到谷歌文档(遵循 Marco Cantu 的优秀 REST 示例),但我收到以下 SSL 错误:

1)如果我使用来自 openssl-0.9.8i-i386-win32.zip 的 SSL dll,我会收到错误消息:

“无法加载 SSL 库”

2) 如果我使用 indy_OpenSSL096m.zip 中的 SSL dll,我会收到错误消息:

“使用 SSL 连接时出错”

3) 如果我使用 openssl-0.9.8h-i386-win32-Indy-IntraWebEdition.zip 中的 SSL dll,我会收到错误消息:

“无法加载 SSl 库”

现在我已经对此进行了研究,并且有很多关于 dll 的死链接的建议,包括堆栈溢出的链接。我怀疑我需要找到与我正在使用的 INDY 版本兼容的 SSL dll。

我的问题是,有谁确切知道哪些 SSL dll 与 Delphi 2006 和 INDY 10.1.5 兼容?

4

5 回答 5

18

即使在我升级到 INDY 10.2.3 之后我也遇到了同样的问题,我尝试了我能找到的每个不同版本的“libeay32.dll”和“ssleay32.dll”文件......就像马特一样,我总是遇到两个错误之一: "Could not load SSL library" 或 "Error connected with SSL" with something like "error:00000006:lib(0):func(0):EVP lib" ...

当我将 TidSSLioHandlerSocketOpenSSL.SSLOptions.Method 更改为 sslvSSLv23 并且一切都开始工作时,我非常高兴。

进行更多研究后,我很快就明白,每当我收到错误“无法加载 SSL 库”时,我使用了错误版本的 DLL 文件,并且每当我收到“与 SSL 连接时出错”时出现“错误:00000006:lib” (0):func(0):EVP lib" 我使用了错误的 SSLOptions.Method 值。

其他信息:我使用的是 Delphi 2006、INDY 10.2.3,我在 WinXP Pro 上运行

这让我很痛苦,我希望这篇文章能节省一些时间。

于 2010-03-12T22:07:41.283 回答
3

您可以使用从Fulgan 站点下载的内容进行一些试验和错误。

您可能需要考虑更新您的 Indy 副本并使用最新的 OpenSSL DLL。

于 2009-12-09T17:19:11.790 回答
3

FWIW,因为我花了很多时间让这个 https 工作,这是我成功努力的结果。

1-德尔福7

2- indy9.0.19_d7.exe

3- IdSSLIOHandlerSocket1.SSLOptions.Method := sslvTLSv1; 或者,

IdSSLIOHandlerSocket1.SSLOptions.Method := sslvTLSv23; 或者,

IdSSLIOHandlerSocket1.SSLOptions.Method := sslvTLSv3;

我在 Delphi 7 下尝试了 indy10.0.76_d7.exe 和 indy10.1.5_d7.exe,但我无法正确安装它们,更不用说让 HTTPS 正常工作了。我收到臭名昭著的消息“Unit IdSysWin32 是用不同版本的 IdException.EIdException 编译的。” 我在网上搜索了该问题的解决方案,但找不到 - 许多其他人都有相同的信息。

用于测试 https 的有用站点是https://msp.f-secure.com/web-test/common/test.html

这是我的来源:

procedure TForm1.ButtonHTTPSClick(Sender: TObject);
var
  IdHTTP1: TIdHTTP;
  ParamStringList: TStringList;
  s1: String;
  MemoryStream1: TMemoryStream;
  IdSSLIOHandlerSocket1:  TIdSSLIOHandlerSocket;
begin //  ssl works fine must have Indy version indy9.0.19_d7.exe and must use option  sslvSSLv23

  Screen.Cursor := crHourGlass;
  IdHTTP1 := TIdHTTP.Create(nil);
  IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocket.Create(nil); 
  IdHTTP1.IOHandler := IdSSLIOHandlerSocket1;

//  IdSSLIOHandlerSocket1.SSLOptions.Method := sslvTLSv1; // sslvSSLv1 works fine
    IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv3; // sslvSSLv3 works fine
//  IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv23; // sslvSSLv23 works fine
//  IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv2;   sslvSSLv2 does not work
    IdSSLIOHandlerSocket1.SSLOptions.Mode := sslmUnassigned;
    IdSSLIOHandlerSocket1.SSLOptions.VerifyMode := [];
  IdSSLIOHandlerSocket1.SSLOptions.VerifyDepth := 0;

  ParamStringList := TStringList.Create;
  MemoryStream1 := TMemoryStream.Create;
  s1 := IdHTTP1.Post('https://msp.f-secure.com/web-test/common/test.html', ParamStringList);
  MemoryStream1.Write(s1[1], Length(s1));
  MemoryStream1.Position := 0;
  MemoryStream1.SaveToFile('c:\temp\MemoryStream1.txt');
  Memo1.Lines.Clear;
  Memo1.Lines.LoadFromFile('c:\temp\MemoryStream1.txt');
  MemoryStream1.Free;
  ParamStringList.Free;
  IdSSLIOHandlerSocket1.Free;
  IdHTTP1.Free;
  Screen.Cursor := crDefault;
end;
于 2012-04-25T01:42:05.433 回答
2

据我所知,最新版本的 Indy 使用标准 OpenSSL 二进制文件。 从这里下载。不久前,我们使用带有 SSL 连接的 Indy 制作了一个 Delphi FTP 客户端应用程序,我确信我们刚刚发布了当前的 OpenSSL dll。

编辑:刚刚检查了应用程序目录,我们使用的 DLL 是 OpenSSL 0.9.8.2(2006 年 8 月 3 日)。(这是一个旧应用程序)

编辑 2:我刚刚复制了更新的 0.9.8k dll,它们也可以正常工作。

于 2009-12-10T10:15:09.320 回答
1

找到您正在使用的 Indy 版本。将 Indy dll 即 libeay32.dll、libssl32.dll 和 ssleay32.dll 复制到 Windows/System 32 文件夹中。它将解决错误“无法加载 SSL 库”

于 2013-05-15T10:36:39.633 回答