15

Explain me please how to download a file from a server using SSL (https://). I have not found an appropriate answer in the Internet.

Everybody says about TIdSSLIOHandlerSocket, but I have only TIdSSLIOHandlerSocketOpenSSL. I have an error 'could not load SSL library' if I use TIdSSLIOHandlerSocketOpenSSL. Some people say it needs a library, but the most even do not mention about it. Do I need to use libraries from here http://www.indyproject.org/sockets/SSL.EN.aspx ?

I have those DLLs in program's folder. According to: http://edn.embarcadero.com/article/31279 "At runtime, Indy attempts to load libeay32.dll and ssleay32.dll." I do not know from where Indy tries to load the DDLs -> I have an error: 'Could not load SSL library.'

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;

Why do I have this error? I have Delphi 2010.

Kenster
  • 23,465
  • 21
  • 80
  • 106
maxfax
  • 4,281
  • 12
  • 74
  • 120
  • 4
    `TIdSSLIOHandlerSocket` is the class name in Indy 9. `TIdSSLIOHandlerSocketOpenSSL` is the new class name in Indy 10. – Remy Lebeau Jul 13 '11 at 19:15

3 Answers3

9

To use Indy's OpenSSL class, you need ssleay32.dll and libeay32.dll. That probably should have been apparent from the source of the exception in the Indy code you tried to execute.

The libraries are linked to from the Indy page mentioned in the question. If you're legally allowed to do so, you can distribute them with your application. Put them wherever DLLs go (usually your application directory).

TIdSSLIOHandlerSocketOpenSSL is an OpenSSL-specific descendant of the abstract TIdSSLIOHandlerSocket class. If you were using some other SSL library instead of OpenSSL, you'd use a different descendant class.

Rob Kennedy
  • 161,384
  • 21
  • 275
  • 467
  • It is not important what and how to use. I need only to download a file using idHTTP+SSL.Can you provide an example of using? I would appreciate it. Thanks. – maxfax Jul 13 '11 at 18:47
  • @maxfax The exception that was raised "could not load SSL library" is solved by using these DLL's. – Robert Love Jul 13 '11 at 18:54
  • I have them in program's folder! How to link them to TIdSSLIOHandlerSocketOpenSSL? – maxfax Jul 13 '11 at 19:01
  • You don't need to link the DLLs to the class. They are loaded automatically at runtime. – Remy Lebeau Jul 13 '11 at 19:13
  • 1
    You don't have to link them to anything. They're loaded automatically with plain old `LoadLibrary` when they're needed. Maxfax, you need to do some troubleshooting of your own. You're getting an exception, and you have the source code, so look at the code to discover what condition caused the exception to be raised. If the condition was a failed function call, then follow the code to that function and see what condition made it fail. Keep following it until you can't go any farther. Document your steps and recount them when you ask for help. – Rob Kennedy Jul 13 '11 at 19:22
  • Maxfax, *you* don't call `LoadLibrary`. I told you before that *Indy* calls it when it needs the DLL. It apparently doesn't get loaded properly, which is why you get an exception. When you get an exception, use the debugger to investigate what happened. The debugger will show you which line of code raised the exception. Read the code backward to find out why. If it's not immediately apparent, set breakpoints earlier in the code and re-run your code to see exactly how it reaches the exception point. If you want, go ahead an call LoadLibrary yourself, wherever you want, just to see if it works. – Rob Kennedy Jul 13 '11 at 20:45
  • Please see my code where the error rises. I have DLLs in program's folder. According to: http://edn.embarcadero.com/article/31279 "At runtime, Indy attempts to load libeay32.dll and ssleay32.dll." I do not know from where Indy tries to load the DDLs – maxfax Jul 13 '11 at 21:04
  • Thanks guys! I have used win64 DLL, not win32 :) – maxfax Jul 13 '11 at 21:16
7

Download openssl-1.0.0d-i386-win32-rev2.zip , not openssl-1.0.0d-x64_86-win64-rev2.zip from http://indy.fulgan.com/SSL/

Read here too: https://forums.embarcadero.com/thread.jspa?threadID=15569

maxfax
  • 4,281
  • 12
  • 74
  • 120
3

It is essential to get the correct DLLs as some are compiled with links to M$ Studio and therefore do not work in Delphi. Try https://indy.fulgan.com/SSL/ Latest versions are at the bottom of the page.