Indy 本身并没有实现 SSL。它所做的是实现了一个灵活的 IOHandler 架构,允许将任何 SSL 实现插入 Indy。Indy 本身实现了自己的基于 OpenSSL 的 IOHandler 类(计划在未来提供 MS CryptoAPI 支持)。例如,SecureBlackbox 为其自己的 SSL 引擎提供了一个 Indy IOHandler 类。
在大多数平台上,OpenSSL 通过外部 DLL 使用,不能从资源中使用。Indy 不附带 OpenSSL DLL,因为 OpenSSL 加密受到国际进出口法律的限制,所以要么在国际上发布的操作系统供应商有特殊的许可证来发布 OpenSSL DLL,要么最终用户必须在本地下载/编译 OpenSSL。这就是让 Indy 在 OpenSSL 方面“可移植”的原因 - Indy 使用在 Indy 外部预安装的任何 OpenSSL DLL,无论是在操作系统中还是在您的应用程序自己的安装文件夹中。
与 Indy 相关的唯一例外是 iOS 上的 OpenSSL,它要求静态使用 OpenSSL,因为 iOS 设备上不允许使用第三方动态库。
如果您想在其他平台上将 OpenSSL 与 Indy 一起静态使用,您必须自己编译/获取 OpenSSL 的静态版本并将其添加到您的项目中,然后重新编译 Indy 以启用其STATICLOAD_OPENSSL
定义(目前仅针对 iOS 定义),并且最后IdSSLOpenSSLHeaders_static.pas
在代码的子句中包含该单元uses
以连接必要的支持代码。 请注意,这仅在最近发布的 Indy 10.6 版本中受支持。
如果这对您来说工作量太大,那么请使用与 Indy 兼容的第三方 SSL 实现,例如 SecureBlackbox,或者编写您自己的 IOHandler 类来满足您的需要。
至于你的其他问题:
1) 如果 Indy在套接字操作期间无法正确加载 OpenSSL,它会引发异常。因此,这些异常很可能在您有机会向用户报告之前就被捕获并吞下。如果您不想依赖它,那么您可以在开始套接字工作之前手动调用单元 Load()
中的 Indy 函数。如果 OpenSSL 尚未加载,则将其加载到内存中。如果失败,您可以调用同一单元中的函数来找出失败的原因。IdSSLOpenSSLHeaders.pas
Load()
Load()
WhichFailedToLoad()
Load()
2) 不,不可能从资源中使用 OpenSSL(没有一些非常严重的低级技巧)。