印不实现SSL本身。它所做的是实现灵活的IOHandler体系结构,允许将任何SSL实现插入Indy。 Indy自己实现了基于OpenSSL的自己的IOHandler类(MS CryptoAPI支持计划在未来)。例如,SecureBlackbox为其自己的SSL引擎提供了一个Indy IOHandler类。
在大多数平台上,OpenSSL通过外部DLL使用,不能从资源中使用。 Indy不附带OpenSSL DLLs,因为OpenSSL加密受到国际进出口法律的限制,所以任何运送国际运营商的OS供应商都有特殊的许可证来运送OpenSSL DLL,或者最终用户必须在本地下载/编译OpenSSL。这就是让Indy在OpenSSL上“便携”的原因 - Indy使用在Indy之外预先安装的任何OpenSSL DLL,无论是在操作系统还是在您的应用程序自己的安装文件夹中。
Indy关注Indy的唯一例外是iOS上的OpenSSL,它需要静态使用OpenSSL,因为iOS设备上不允许使用第三方动态库。
如果您想在其他平台上与Indy静态使用OpenSSL,您必须自己编译/获取静态版本的OpenSSL并将其添加到您的项目,然后重新编译Indy以启用它的STATICLOAD_OPENSSL
define(目前仅限定义对于iOS),最后在您的代码的uses
子句中包含IdSSLOpenSSLHeaders_static.pas
单元以连接必要的支持代码。 请注意,仅在最近发布的Indy 10.6版本中才支持此功能。
如果这对于您来说工作太多,那么请使用与Indy兼容的第三方SSL实施(如SecureBlackbox),或编写您自己的IOHandler类,以满足您的需求。
至于你的其他问题:
1)印确实引发异常,如果它不能在套接字操作正确加载OpenSSL的。因此,在您有机会向用户报告这些情况之前,这些例外会被抓住并吞下。如果你不想依赖它,那么在开始你的套接字工作之前,你可以手动调用Indy的Load()
函数在IdSSLOpenSSLHeaders.pas
单元中。如果尚未加载OpenSSL,则Load()
将加载到内存中。如果Load()
失败,则可以调用该单元中的WhichFailedToLoad()
函数来找出为什么Load()
失败。
2)不,从资源中使用OpenSSL是不可能的(没有一些真正严重的低级欺骗)。
非常感谢!这为我清除了一切。 – 2013-05-03 22:30:14
为什么Indy不能原生实现SSL?每个人都会因为这些外部DLL的需要而受苦。 – 2013-05-04 13:30:41
这将是本地实施SSL的一项重大任务。当其他人已经提供实施时,为什么要浪费时间和精力?无论如何,我确实提到过我们计划为CryptoAPI创建一个IOHandler包装器,以便在Windows上解决DLL和导入/导出问题,因为它是内置于操作系统的。在其他平台上,通常使用OpenSSL。 – 2013-05-04 16:13:45