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库?
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(没有一些非常严重的低级欺骗).
归档时间: |
|
查看次数: |
8509 次 |
最近记录: |