OpenSSL 1.0.2.g 更新破坏了我的 Delphi 应用程序

OpenSSL 1.0.2.g update breaks my Delphi app

我的 Win32 程序在从 OpenSSL 1.02f 升级到 1.02g 后失败。
我确保在升级后重新启动,并且我已验证正确的 libeay32.dlllibssl32.dllssleay32.dllC:\Windows\SysWOW64 中(如果我这样做也无济于事)将它们复制到我的应用程序目录)。

var
  lIOHandleSSL      : TIdServerIOHandlerSSLOpenSSL;
  FWebBrokerBridge  : TIdHTTPWebBrokerBridge;       // = class(TIdCustomHTTPServer)
begin    
  FWebBrokerBridge := TIdHTTPWebBrokerBridge.Create(Self);    
  LIOHandleSSL := TIdServerIOHandlerSSLOpenSSL.Create(FWebBrokerBridge);    // LIOHandleSSL.SSLOptions.method is sslvTLSv1
  LIOHandleSSL.SSLOptions.CertFile     := ...
  LIOHandleSSL.SSLOptions.RootCertFile := ...
  LIOHandleSSL.SSLOptions.KeyFile      := ...
  LIOHandleSSL.OnGetPassword := HTTPSIOHandlerSSLOpenSSLGetPassword;
  FWebBrokerBridge.IOHandler := LIOHandleSSL;
  FWebBrokerBridge.Active := true;

错误是 'Active' 语句中的 EIdOSSLCouldNotLoadSSLLibrary: Could not load SSL library

这是怎么回事,如何解决

这是一个Delphi XE2应用程序,Indy版本是10.5.8.0

FWIW Here is the OpenSSL 1.02g changelog

[编辑添加]
- 我们使用 this OpenSSL binary installer.
- 我添加了 WhichFailedToLoad() 函数(来自 IdSSLOpenSSLHeaders.pas),它 returns 以下字符串:SSLv2_method,SSLv2_server_method,SSLv2_client_method
- 我已经从这个问题中删除了我的证书文件的描述。 Ken White 正确地指出代码尚未处于加载证书的阶段

此处介绍:http://www.indyproject.org/sockets/blogs/changelog/20150907.en.aspx

综上所述,SSLv2 并不安全,因此一些 OpenSSL 发行商禁用了 SSL2。您似乎正在使用这样的 OpenSSL。 Indy 的旧版本将以下功能视为关键:

  • SSLv2_method
  • SSLv2_server_method
  • SSLv2_client_method

如果 OpenSSL DLL 不导出这些函数,则这些版本的 Indy 将无法加载。

要解决此问题,您需要执行以下操作之一:

  • 查找不禁用 SSLv2 的 OpenSSL DLL。这听起来不像是解决问题的聪明方法。
  • 升级到可以处理 SSLv2 被禁用的 Indy 版本。
  • 升级到 Delphi 10 Seattle Update 1,其中包括 Indy 修订版 5311 是处理该问题的最早 Delphi 版本。