Delphi: idHttp + SSL
Объясните мне, пожалуйста, как загрузить файл с сервера с помощью SSL (https://). Я не нашел подходящего ответа в Интернете.
Все говорят о TIdSSLIOHandlerSocket, но у меня есть только TIdSSLIOHandlerSocketOpenSSL.
У меня есть ошибка "не удалось загрузить библиотеку SSL", если я использую TIdSSLIOHandlerSocketOpenSSL.
Некоторые говорят, что ему нужна библиотека, но даже не упоминают об этом. Мне нужно использовать библиотеки здесь 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.
Ответы
Ответ 1
Чтобы использовать класс Indy OpenSSL, вам нужны ssleay32.dll и libeay32.dll. Вероятно, это должно было быть очевидно из источника исключения в коде Indy, который вы пытались выполнить.
Библиотеки связаны с страницей Indy, указанной в вопросе. Если вам разрешено юридическое действие, вы можете распространять их в своем приложении. Поместите их туда, куда идут DLL (обычно ваш каталог приложений).
TIdSSLIOHandlerSocketOpenSSL - это потомок абстрактного класса TIdSSLIOHandlerSocket, специфичный для OpenSSL. Если вы использовали другую библиотеку SSL вместо OpenSSL, вы бы использовали другой класс потомков.
Ответ 2
Загрузить 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
Ответ 3
Необходимо получить правильные DLL, поскольку некоторые из них скомпилированы со ссылками на M $Studio и поэтому не работают в Delphi. Попробуйте https://indy.fulgan.com/SSL/
Последние версии находятся в нижней части страницы.
Ответ 4
У меня была та же проблема, я использую Delphi 2010 для компиляции на 32-битной машине.
Когда я использовал TIdHTTP для вызова только HTTP-адресов, все работало нормально как на 32b, так и на 64b.
Затем мне нужно было вызвать HTTPS-URL, я выполнил все инструкции, добавил этот код
IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
И я поместил 2 dll в папку exe
"10 апреля 2011 г. 13:21 850543 openssl-0.9.8r-i386-win32-rev2.zip"
Теперь он отлично работает на машине 32b, но на 64-битной машине я получаю ошибку "Ошибка сокета # 10060.
Время ожидания подключения "через несколько секунд.
Я попробовал 64-битные DLL на всякий случай, они создают ошибку "Не удалось загрузить библиотеку SSL"
У кого-то была такая же проблема? Должен ли я разместить еще несколько кода?
--- Редактировать --- 32-разрядная машина запускает Win7, 64-битная машина запускает Win8.