问题 Delphi:idHttp + SSL


请解释我如何使用SSL(https://)从服务器下载文件。我没有在互联网上找到合适的答案。

每个人都说TIdSSLIOHandlerSocket,但我只有TIdSSLIOHandlerSocketOpenSSL。 如果我使用TIdSSLIOHandlerSocketOpenSSL,我有一个错误'无法加载SSL库'。 有人说它需要一个图书馆,但最不提的是它。我需要从这里使用库吗? http://www.indyproject.org/sockets/SSL.EN.aspx ?

我在程序的文件夹中有这些DLL。根据: http://edn.embarcadero.com/article/31279 “在运行时,Indy试图加载libeay32.dll和ssleay32.dll。”我不知道Indy试图加载DDL的位置 - >我有一个错误:'无法加载SSL库。'

procedure TForm1.FormCreate(Sender: TObject);
    var  UpdateMemoryStream:tmemorystream;
    begin
    try
    UpdateMemoryStream:=TMemoryStream.Create;
                try
                idhttp2.Get('https://example.com/list.rar',UpdateMemoryStream); //I have: Exception class EIdOSSLCouldNotLoadSSLLibrary with message 'Could not load SSL library.'
                except
                    on E : Exception do 
                    begin showmessage('Error: '+E.Message); 
                    end;
                end;
    UpdateMemoryStream.SaveToFile('d:\1.rar');
    finally
    UpdateMemoryStream.Free;
    end;
    end;

为什么我有这个错误? 我有Delphi 2010。


6269
2017-07-13 17:36


起源

TIdSSLIOHandlerSocket 是Indy 9中的班级名称。 TIdSSLIOHandlerSocketOpenSSL 是Indy 10中的新类名。 - Remy Lebeau


答案:


要使用Indy的OpenSSL类,您需要 ssleay32.dll 和 的libeay32.dll。从您尝试执行的Indy代码中的异常来源可能已经很明显。

这些库链接到问题中提到的Indy页面。如果您在法律上允许这样做,您可以将其与您的申请一起分发。将它们放在DLL的任何地方(通常是您的应用程序目录)。

TIdSSLIOHandlerSocketOpenSSL是抽象TIdSSLIOHandlerSocket类的特定于OpenSSL的后代。如果您使用的是其他SSL库而不是OpenSSL,则可以使用不同的后代类。


7
2017-07-13 18:12



什么和如何使用并不重要。我只需要使用idHTTP + SSL下载文件。您能提供一个使用示例吗?我会很感激。谢谢。 - maxfax
@maxfax使用这些DLL解决了引发的“无法加载SSL库”的异常。 - Robert Love
我把它们放在程序的文件夹中!如何将它们链接到TIdSSLIOHandlerSocketOpenSSL? - maxfax
您不需要将DLL链接到类。它们在运行时自动加载。 - Remy Lebeau
您不必将它们链接到任何东西。他们用普通的旧货自动装货 LoadLibrary 当他们需要的时候。 Maxfax,您需要对自己进行一些故障排除。你得到一个异常,并且你有源代码,所以看一下代码来发现引起异常的条件。如果条件是函数调用失败,那么请遵循该函数的代码并查看使其失败的条件。继续关注它,直到你不能再往前走。记录您的步骤并在您寻求帮助时重新计算它们。 - Rob Kennedy


下载openssl-1.0.0d-i386-的win32-rev2.zip,不是openssl-1.0.0d-x64_86-Win64平台-rev2.zip来自 http://indy.fulgan.com/SSL/

在这里阅读: https://forums.embarcadero.com/thread.jspa?threadID=15569


6
2017-07-13 21:15



对。您正在编写32位程序,因此需要32位DLL。 - Rob Kennedy
embarcadero链接不起作用 - Yevgeniy Afanasyev


获取正确的DLL是必不可少的,因为有些是使用M $ Studio的链接编译的,因此在Delphi中不起作用。尝试 https://indy.fulgan.com/SSL/ 最新版本位于页面底部。


1
2017-11-03 07:00