OpenSSL 1.0.2.g 更新破坏了我的 Delphi 应用程序
OpenSSL 1.0.2.g update breaks my Delphi app
我的 Win32 程序在从 OpenSSL 1.02f 升级到 1.02g 后失败。
我确保在升级后重新启动,并且我已验证正确的 libeay32.dll
、libssl32.dll
和 ssleay32.dll
在 C:\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 版本。
我的 Win32 程序在从 OpenSSL 1.02f 升级到 1.02g 后失败。
我确保在升级后重新启动,并且我已验证正确的 libeay32.dll
、libssl32.dll
和 ssleay32.dll
在 C:\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 版本。