Indy 10和OpenSSL

时间:2013-05-03 21:32:44

标签: delphi ssl delphi-xe2 indy indy10

我最近将Delphi 7升级到Delphi XE2,我对它有点新意。我使用Indy 10和OpenSSL来接收HTTP内容。它运作得很好,我想与其他人分享我的程序。我刚刚发现,如果没有OpenSSL库,我的程序将无法在其他PC上运行。我甚至没有得到丢失的DLL文件的异常,错误等。我认为Indy10具有本机SSL支持或者至少在编译后使用资源中的DLL,因此它是可移植的。我有两个问题:

1)我怎样才能让用户知道他/她缺少OpenSSL库? (我的朋友报告没有异常,错误等,没有OpenSSL DLL。)

2)是否可以让Indy10从资源中读取OpenSSL库?

2 个答案:

答案 0 :(得分:9)

Indy本身并未实施SSL。它的作用是实现灵活的IOHandler架构,允许将任何SSL实现插入到Indy中。 Indy本身实现了自己的基于OpenSSL的IOHandler类(MS CryptoAPI支持计划在未来使用)。例如,SecureBlackbox为其自己的SSL引擎提供了Indy IOHandler类。

在大多数平台上,OpenSSL通过外部DLL使用,不能从资源中使用。 Indy没有附带OpenSSL DLL,因为OpenSSL加密受到国际进口/出口法律的限制,因此国际运输的OS供应商都有运送OpenSSL DLL的特殊许可,或者最终用户必须在本地下载/编译OpenSSL。这就是Indy在OpenSSL上“便携”的原因 - Indy使用在Indy之外预安装的任何OpenSSL DLL,无论是在操作系统中还是在应用程序自己的安装文件夹中。

关于Indy的唯一例外是iOS上的OpenSSL,它要求静态使用OpenSSL,因为iOS设备上不允许使用第三方动态库。

如果你想在其他平台上静态使用OpenSSL,你必须自己编译/获取OpenSSL的静态版本并将其添加到你的项目中,然后重新编译Indy以启用它的STATICLOAD_OPENSSL define(这是目前只为iOS定义,最后在代码的IdSSLOpenSSLHeaders_static.pas子句中包含uses单元,以连接必要的支持代码。 请注意,仅在最近发布的Indy 10.6版本中支持此功能。

如果这对您来说太多了,那么请使用与Indy兼容的第三方SSL实现,例如SecureBlackbox,或编写您自己的IOHandler类,以满足您的需求。

至于你的其他问题:

1)如果在套接字操作期间无法正确加载OpenSSL,Indy 引发异常。因此,在您有机会向用户报告之前,很可能会遇到并吞下这些异常。如果您不想依赖它,那么在开始套接字工作之前,您可以在Load()单元中手动调用Indy的IdSSLOpenSSLHeaders.pas函数。 Load()会将OpenSSL加载到内存中(如果尚未加载)。如果Load()失败,您可以调用同一单元中的WhichFailedToLoad()函数,找出Load()失败的原因。

2)不,不可能从资源中使用OpenSSL(没有一些非常严重的低级欺骗)。

答案 1 :(得分:1)

1)尝试在调用Indy之前自己加载e DLL,如果LoadLibrary失败,则可以引发异常。

2)你可以看一下:

Load a DLL From a Resource Directly From Memory in Delphi Applications