Всем привет, небольшая заметка о том, как можно с помощью компонентов Indy загружать защищенные веб-страницы, да и не только загружать, а в целом работать с ними (запросы: GET, POST). Насколько я знаю, у всех версиях Indy эта проблема давно наблюдается. Ну, а сейчас немного теории. SSL - это протокол, с помощью которого можно осущеставлять безопасное соединение между клиентом и сервером. Вообще, если Вы загружаете в браузере защищенную страницу, то Вы сразу можете прочитать информацию о защищенной странице, например, в браузере GoogleChrome, при загрузке защищенной страницы в адресной строке появляется «замочек», что означает — была загружена защищенная страница.
А, если нажать на этот замочек, то можно посмотреть более подробную информацию о защищенной странице, где Вы сможете посмотреть сертификат безопасности, алгоритм шифрования страницы, данных и многое другое.
Так как, у Indy с данной задачей давненько проблемы, то некоторые пользователи, для того, чтобы получить код защищенной страницы, отправить запрос, получить ответ с сервера, используют компонент TWebBrowser, что очень неудобно, он все таки визуальный.
Ну что, теперь давайте приступим к самому проекту. Что нам необходимо будет, на форме у меня следующие компоненты:
- TIdHTTP
- TIdSSLIOHandlerSocketOpenSSL
Давайте немного настроим эти компоненты, в свойстве компонента TIdHTTP - IOHandler укажем компонент TIdSSLIOHandlerSocketOpenSSL. Это еще не все, если Вы попробуйте загрузить, через запрос GET, защищенную веб-страницу, то естестевенно у Вас будет ошибка. Для всего этого нам необходимо будет скачать последнею версию библиотеки Openssl, но я скачал RunTimePack библиотек и установил их. Нам необходимы только 2-е dll-ки:
- libeay32.dll
- ssleay32.dll
Их, можно скопировать в папку Вашего проекта, или в системный каталог Windows (system32), лучше всего, носить в папке с проектом, так как не у всех пользователей могут быть установлены данные библиотеки.
Все, как только все это сделано, можно загружать защищенные https-страницы обычным способом:
procedure TForm1.Button1Click(Sender: TObject);
var
html:WideString;
begin
html:=idHTTP1.Get('https://адрес защищенного сайта');
ShowMessage(html);
end;
Если, будете создавать компоненты в run-time, то не забывайте подключать в Uses модули IdSSL, IdSSLOpenSSL.
Версия Indy, на которой тестировался данный код — 10.5.7
Исходник прилаживать не буду, кому необходимо будет, скажите в комментариях.
Если вы хотите что бы ваша иммиграция в Чехию прошла, как можно успешно и безопасно, то в сети есть необходимые ресурсы, которые помогут вам.
Похожие записи
Метки: Idhttp, idhttp+https, idhttp+ssl, Indy, Indy+https, indy+SSL, TidHTTP, tidhttp+ssl
Здравстуйте, Andrey. У меня не комментарий к статье, а вопрос по Indy. Пользую Delphi7 с Indy9 в стандартном комплекте. Можно ли заставить Indy9 FTP передавать/принимать файлы больше 2ГГб? Ответ — переходи на Indy10, я знаю. Перехожу на Delphi2007, но постепенно, надеюсь получится. Но это в будущем, а сейчас нужно заставить свою прогу, сделаную в D7, научить это делать. Пробовал править IdFTP.pas, IdFTPServer.pas, переделывая все integer в Int64, результат = 0. Может Вы знаете решение. Либо такие-же хорошие дёмки по indy10, как и в indy9. Спасибо.
так, а какие проблемы переустановить версию Indy? это же пару минут и все
[…] Так как, данные запросы работают по зазщищенному протоколу, а Indy стандарнтыми средствами не справляется с SSL, то давайте вспомним статью Indy+SSL. Загрузка https-страниц. TIdHTTP+SSL. […]
Здравствуйте, Andrey.
Сделал все как написано, но при выполнении Get запроса вылетает следующая ошибка «Точка входа в процедуру OBJ_bsearch не найдена в библиотеке DLL libeay32.dll». Пробовал разные библиотеки, таже ошибка.
скачайте более новые и последние библиотеки
spasibo, o4enj pomogla tvaja statja, vnedril eti dllki v .exe i pri zapuske oni razpakovavajutsa rjadom i ispolzujutsa.
версии библиотек : libeay32.dll ssleay32.dll
openssl-0.9.8k_WIN32.zip openssl-0.9.8k WIN32 Featured Jul 2009 1.2 MB 173110
openssl-0.9.8k_X64.zip openssl-0.9.8k X64 Featured Jul 2009 1.4 MB 48122
openssl-0.9.8e_X64.zip openssl-0.9.8e X64 Jul 2009 1.3 MB 4952
openssl-0.9.8e_WIN32.zip openssl-0.9.8e WIN32 Jul 2009 1.1 MB 8967
openssl-0.9.8d_X64.rar openssl-0.9.8d X64 Jul 2009 1.3 MB 3119
openssl-0.9.8d_WIN32.rar openssl-0.9.8d win32 Jul 2009 1.2 MB 5375
можно скачать здесь.
https://code.google.com/p/openssl-for-windows/downloads/list?can=2&q=openssl
Спасибо автору за полезную информацыю которая сейчас кстати. Вот решыл создать небольшой проект но работа с компонентами Indy мне чужда.
Здраствуйте, скиньте пожалуйста исходник. Пытался авторизоваться на сайте http://blogun.ru но по непонятным причинам выдает ошибку socket error #0
Буду, очень благодарен.
возможно вы не все переменные отправляете на блогун, покажите лучше ваш исходник
Добрый день. встала задача следующая: приложение должно авторизоваться с указанным логином и паролем на сайте, получить некоторую статистику из аккаунта. Соединение не защищено. У Вас случаем нет примеров готовых приложений такого типа? Был бы крайне признателен.
необходимо создать переменную типа TStringList, затем необходимо узнать ссылку страницы, на которую отправляются переменные, ищем имена переменных и добавляем их такого плана:
PostAdd:TStringList
PostAdd.Add(‘perem1=znach’);
PostAdd.Add(perem2=znach2);
тут отправляем переменные
Idhttp1.Post(‘страница куда отправляются значения переменных’,PostAdd);
Простите а как добавить свою публикацию на блог ? (без регистрации)
только с регистрацией, если хотите опубликовать свою, то присылайте на punisher45 собака rambler.ru и обязательно указывайте автора и адрес ресурса, если она ссылается на что-то
здравствуйте , сделал все как написано но дает ошибку socket error #0 вот исх
var
PostData : TStringList;
StrPage:string;
begin
PostData := TStringList.Create;
try
PostData := TStringList.Create;
PostData.Add(‘page=https://e.mail.ru/cgi-bin/msglist?new_auth_form=1&saveauth=1′);
PostData.Add(‘post=’);
PostData.Add(‘login_from=’);
PostData.Add(‘lang=’);
PostData.Add(‘setLang=’);
PostData.Add(‘Login=логин’);
PostData.Add(‘Domain=mail.ru’);
PostData.Add(‘Password=пасс’);
PostData.Add(‘saveauth=1′);
PostData.Add(‘new_auth_form=1′);
StrPage:= IdHTTP1.Post(‘https://auth.mail.ru/cgi-bin/auth’,PostData);
if Pos(‘logout’,StrPage)0 then
ShowMessage(‘Авторизовались!’)
else
ShowMessage(‘Авторизация не удалась!’);
finally
PostData.free;
А ошибка какая есть?
ну вот дает ошибку socket error #0 сначала давал iohandler value is not valid потом мне посоветовали поставить delphi 2010 там вроде есть уже нужные библиотеки установил все та же ошибка(
потом сделал как тут писало и вот ….
тут дело может быть в самой странице, Вы на 2010 году Delphi делаете?
да, работаю с delphi 2010 ….. но вот друг который мне посоветовал поставить 2010 говорит что у него не дает ошибок … что же делать ….. мне без этого никак
у него тот же самый код выполняется без ошибок?
говорил что без ошибок …. у тебя работает все ?
мой пример, что описан в статье работает без ошибок, а Ваш я не пробовал
помоги пожалуйста ….. 2 день с этой проблемой …
попробуй пож и напиши …
попробую немного позже
пожалуйста помоги мне с этой проблемой несколько дней уже сижу никак не могу решить ….отблагодарю в денежной форме если быстро поможешь решить …..
в понедельник дам ответ, денег не надо, так как данный ресурс предназначен для получения и реения проблем путем бесплатных знаний
ок спасибо заранее
ну как ?
необходимо библиотеки libeay32.dll и ssleay32.dll под Вашу версию Indy, а также компонент IdSocksInfo, в котором необходимо указывать версию и связать его надо с компонентом IdSSLIOHandlerSocket, в котором тоже надо похимичить со свойством MEthod
спасибо испробую …. я почти эту проблему решу если уберу » s » но вот если напишу верные данные то опять эта ошибка так как идет редирект ….ты не знаешь как сделать самому редирект ? тут простой гет запрос не поможет …
почему же, c помощью GET можно перенаправить
нет , я пробовал дает ошибку 302, а если включить редирект то такой ошибки нет
включить редирект где? в компоненте?
да …….не знаю уже что делать ….. попробовал с синапс поработать такой ошибки не дает но не могу получить исходник страницы ….потом с исходником сделаю проверку на авторизацию …у тебя скайп или ася есть ? помоги мне пожалуйста неделю как сижу с этой проблемой … мой скайп : admin-one1 icq:6035914 буду очень благодарен если поможешь мне ….только не игнорь я незнаю уже к кому обратится ….
мой скайп — andrey_z53
Все работает отлично, но вот возникла проблемка, что делать если пост запрос больше 255 симыолов при таком раскладе не компилируется, ругается на длину
А пример такого запроса? Может есть возможность использовать widestring
вот он запрос на ркгу в жж https://www.livejournal.com/__api/«jsonrpc»:»2.0″,»method»:»signup.create_user»,»params»:{«username»:»‘)+ login ‘»,»email»:»medkatok@yandex.ru»,»password»:»778899″,»passwordconfirm»:»5Q7bv03″,»gender»:»M»,»year»:»1983″,»month»:»9″,»day»:»11″,»recaptcha_challenge_field»:»03AHJ_VutyurDxaO8F1TC3-lXCe3Wo-R9MxW6MSwEqMJQfv0kBIEnMV2cgN9VcRwhj5d9eQF3C-eV1kTRvsaDEgH-TUdpT1TQBIr-pi9opVWMW2XMKwgT6i68d9fCYz8n5idErD_8opLyzgNhd2adjgiv0vC4ZItsLBocJM-aM3AeSdjJMM7UDPluAxbgN5fze0dGpJvaQem_v»,»recaptcha_response_field»:»‘+cap+'»,»auth_token»:»sessionless:1358251200:/__api/::a21919f239ad133131a725629d214e6f86ee8128″},»id»:5}’)););
разделите его, например так, s1+s2, по переменным разделите запрос, попробуйте
Добрый день, уже не знаю у кого спросить) Спрошу у Вас)
Думаю Вы знаете что https нужен для шифрования отправляемых данных от клиента к серверу, и обратно. Если попробовать поснифать браузер открывающий сайт через https, ни чего не выйдет, просто снифер ни чего не покажет. Однако, если снифать программу написанную в Delphi (TIdHTTP+TIdSSLIOHandlerSocketOpenSSL), можно увидеть все запросы и все полученные данные. Пример http://s45.radikal.ru/i107/130.....767f32.png
В связи с этим возникает вопрос, а не знаете ли Вы как можно победить это недоразумение? Уже на многих форум задал этот вопрос, ни кто не знает к сожалению.
Доброго дня. Может мысли будут почему этот код работает под Win32 и Android и валится под iOS?
rcvrdata := TMemoryStream.Create;
IdHTTP := TIdHTTP.Create(nil);
IdHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
IdHTTP.IOHandler := IdHandler;
IdHTTP.MaxAuthRetries := 10;
sans := IdHTTP.Get(‘https://mail.tut.by’); //// !!!! точка падения/зависания
FreeAndNil(IdHandler);
FreeAndNil(rcvrdata);
FreeAndNil(IdHTTP);
Подскажите, как можно с использованием вашего примера скачать файл с Дропбокса. Там так же используется защищенное соединение. Я пробовал процедурой get через поток. Но выходит ошибка. Знаю, что в wget подобная проблема устраняется указанием флага —no-check-certificate
Пожалуйста киньте исходник данной проги, а то чето вообще не получается, столько ошибок выдал….
Давайте разбираться с ошибками, показывайте! Какая версия Delphi?
Добрый день
Я похоже столкнулся с проблемой которую вы решали со Stas-ом в 2012-ом. При выполнении Get вылетает ошибка, но нет ни номера ошибки, ни текста
Project raised exception class EIdHTTPProtocolException with message ». Никак не могу понят в чем может быть проблема.
Тоже столкнулся с подобной проблемой, но только на старых версиях среды разработки. Поставил RAD XE6 (там видимо компонент обновлен) — работает как с hhtp, так и https.
Совершенно верно, там компоненты обновленные
Работаю с новыми версиями RAD XE6, никаких проблем с шифрованным протоколом не было. Автору отдельная благодарность за статью!
Спасибо большое!