Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Indy 10和OpenSSL_Delphi_Ssl_Delphi Xe2_Indy_Indy10 - Fatal编程技术网

Delphi Indy 10和OpenSSL

Delphi Indy 10和OpenSSL,delphi,ssl,delphi-xe2,indy,indy10,Delphi,Ssl,Delphi Xe2,Indy,Indy10,我最近将我的Delphi7升级到Delphi XE2,我对它有点陌生。我使用Indy 10和OpenSSL来接收HTTP内容。它工作得很好,我想与其他人分享我的程序。我刚刚发现,如果没有OpenSSL库,我的程序将无法在其他PC上运行。我甚至没有得到一个异常,错误等丢失的DLL文件。我认为Indy10要么具有本机SSL支持,要么至少在编译后使用了资源中的DLL,因此它是可移植的。我有两个问题: 1) 我如何才能让用户知道他/她缺少OpenSSL库?(如果没有OpenSSL DLL,我的朋友没有报

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

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

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

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

2) 你可以,看看这个:


Indy不以本机方式实现SSL。它所做的是实现一个灵活的IOHandler体系结构,允许将任何SSL实现插入Indy。Indy本身实现了自己的IOHandler类,该类基于OpenSSL(MS CryptoAPI支持计划在未来提供)。例如,SecureBackbox为自己的SSL引擎提供了一个Indy IOHandler类

在大多数平台上,OpenSSL通过外部DLL使用,而外部DLL不能从资源中使用。Indy不提供OpenSSL DLL,因为OpenSSL加密受国际进出口法的限制,因此国际上提供的操作系统供应商拥有提供OpenSSL DLL的特殊许可证,或者最终用户必须自己在本地下载/编译OpenSSL。这就是为什么Indy在使用OpenSSL时具有“可移植性”——Indy使用在Indy之外预安装的任何OpenSSL DLL,无论是在操作系统中还是在应用程序自己的安装文件夹中

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

如果您想在其他平台上与Indy一起静态使用OpenSSL,您必须自己编译/获取OpenSSL的静态版本并将其添加到您的项目中,然后重新编译Indy以启用其
STATICLOAD\u OpenSSL
define(目前仅为iOS定义),最后,在代码的
uses
子句中包含
IdSSLOpenSSLHeaders\u static.pas
单元,以连接必要的支持代码请注意,这仅在最近发布的Indy 10.6版本中受支持。

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

至于你的其他问题:

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


2) 不,从资源中使用OpenSSL是不可能的(如果没有一些真正严重的低级欺骗)。

这应该可以,但我必须编辑实际的Indy源代码,我不知道从哪里开始。为什么要编辑Indy代码?应用程序将只加载dll一次,因此如果您在调用indy之前加载它,您会没事的。我不知道这是否可能,如果indy在我之前调用LoadLibrary(初始化),会怎么样。如果Indy调用GetModuleHandle等,它可能会加载库两次或更多。还没有测试任何东西,但我稍后会测试它是否有效。BTMemoryModule中的BTMemoryLoadLibrary是否确实将该模块添加到进程的已加载模块列表中?Indy在需要OpenSSL DLL之前不会将其加载到内存中。Indy不使用
GetModuleHandle()
,它通过
LoadLibrary()
加载DLL,并跟踪这些句柄,在不再需要时关闭它们。为什么Indy不以本机方式实现SSL?由于需要这些外部dll,每个人都会受到影响。以本机方式实现SSL将是一项重大任务。既然其他人已经提供了实现,为什么还要浪费时间和精力呢?在任何情况下,我确实提到过我们计划为CryptoAPI创建一个IOHandler包装器,这样可以解决Windows上的DLL和导入/导出问题,因为它内置于操作系统中。在其他平台上,OpenSSL是常用的。其他流行的库,如ICS和Synapse,也不以本机方式实现SSL。它们依赖于OpenSSL等外部LIB。@Remy Indy是否实现了CryptoAPI的包装器?@NasreddineGalfout不,还没有。它仍在运行中