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

时间:2016-03-09 15:11:32

标签: delphi openssl certificate delphi-xe2 indy10

从OpenSSL 1.02f升级到1.02g后,我的Win32程序失败 我确保在升级后重新启动,并且我已验证libeay32.dlllibssl32.dllssleay32.dll位于C:\Windows\SysWOW64中(如果我将它们复制到我的app目录。)

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;

'有效'错误为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)并返回以下字符串:SSLv2_method,SSLv2_server_method,SSLv2_client_method
- 我已从此问题中删除了我的证书文件的说明。 Ken White正确地指出代码还没有加载证书的阶段

1 个答案:

答案 0 :(得分:5)

此处介绍: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版本。