Indy 10和OpenSSL

Ben*_*iss 5 delphi ssl indy indy10 delphi-xe2

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

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

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

Rem*_*eau 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定义(目前只为iOS定义),以及最后IdSSLOpenSSLHeaders_static.pas在代码的uses子句中包含该单元以连接必要的支持代码. 请注意,仅在最近发布的Indy 10.6版本中支持此功能.

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

至于你的其他问题:

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

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

  • 本地实现 SSL 将是一项重大任务。当其他人已经提供实现时,为什么还要浪费时间和精力呢?无论如何,我确实提到我们计划为 CryptoAPI 创建一个 IOHandler 包装器,这样就可以解决 Windows 上的 DLL 和导入/导出问题,因为它内置于操作系统中。在其他平台上,通常使用 OpenSSL。 (2认同)
  • 其他流行的库,如ICS和Synapse,也没有本地实现SSL.他们依赖OpenSSL等外部库. (2认同)