Всем привет, небольшая заметка о том, как можно с помощью компонентов 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

Исходник прилаживать не буду, кому необходимо будет, скажите в комментариях.


Если вы хотите что бы ваша иммиграция в Чехию прошла, как можно успешно и безопасно, то в сети есть необходимые ресурсы, которые помогут вам.


Метки: , , , , , , ,




К записи “Indy+SSL. Загрузка https-страниц. TIdHTTP+SSL” оставлено комментариев: 50.

  1. Павел:

    Здравстуйте, Andrey. У меня не комментарий к статье, а вопрос по Indy. Пользую Delphi7 с Indy9 в стандартном комплекте. Можно ли заставить Indy9 FTP передавать/принимать файлы больше 2ГГб? Ответ — переходи на Indy10, я знаю. Перехожу на Delphi2007, но постепенно, надеюсь получится. Но это в будущем, а сейчас нужно заставить свою прогу, сделаную в D7, научить это делать. Пробовал править IdFTP.pas, IdFTPServer.pas, переделывая все integer в Int64, результат = 0. Может Вы знаете решение. Либо такие-же хорошие дёмки по indy10, как и в indy9. Спасибо.

  2. […] Так как, данные запросы работают по зазщищенному протоколу, а Indy стандарнтыми средствами не справляется с SSL, то давайте вспомним статью Indy+SSL. Загрузка https-страниц. TIdHTTP+SSL. […]

  3. Alex:

    Здравствуйте, Andrey.
    Сделал все как написано, но при выполнении Get запроса вылетает следующая ошибка «Точка входа в процедуру OBJ_bsearch не найдена в библиотеке DLL libeay32.dll». Пробовал разные библиотеки, таже ошибка.

  4. aleex:

    spasibo, o4enj pomogla tvaja statja, vnedril eti dllki v .exe i pri zapuske oni razpakovavajutsa rjadom i ispolzujutsa.

  5. версии библиотек : 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

  6. Спасибо автору за полезную информацыю которая сейчас кстати. Вот решыл создать небольшой проект но работа с компонентами Indy мне чужда.

  7. Константин:

    Здраствуйте, скиньте пожалуйста исходник. Пытался авторизоваться на сайте http://blogun.ru но по непонятным причинам выдает ошибку socket error #0

    Буду, очень благодарен.

  8. Александр:

    Добрый день. встала задача следующая: приложение должно авторизоваться с указанным логином и паролем на сайте, получить некоторую статистику из аккаунта. Соединение не защищено. У Вас случаем нет примеров готовых приложений такого типа? Был бы крайне признателен.

    • Andrey:

      необходимо создать переменную типа TStringList, затем необходимо узнать ссылку страницы, на которую отправляются переменные, ищем имена переменных и добавляем их такого плана:
      PostAdd:TStringList
      PostAdd.Add(‘perem1=znach’);
      PostAdd.Add(perem2=znach2);
      тут отправляем переменные
      Idhttp1.Post(‘страница куда отправляются значения переменных’,PostAdd);

  9. Простите а как добавить свою публикацию на блог ? (без регистрации)

    • Andrey:

      только с регистрацией, если хотите опубликовать свою, то присылайте на punisher45 собака rambler.ru и обязательно указывайте автора и адрес ресурса, если она ссылается на что-то

  10. stas:

    здравствуйте , сделал все как написано но дает ошибку 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;

    • Andrey:

      А ошибка какая есть?

      • stas:

        ну вот дает ошибку socket error #0 сначала давал iohandler value is not valid потом мне посоветовали поставить delphi 2010 там вроде есть уже нужные библиотеки установил все та же ошибка(
        потом сделал как тут писало и вот ….

        • Andrey:

          тут дело может быть в самой странице, Вы на 2010 году Delphi делаете?

          • stas:

            да, работаю с delphi 2010 ….. но вот друг который мне посоветовал поставить 2010 говорит что у него не дает ошибок … что же делать ….. мне без этого никак

          • Andrey:

            у него тот же самый код выполняется без ошибок?

          • stas:

            говорил что без ошибок …. у тебя работает все ?

          • Andrey:

            мой пример, что описан в статье работает без ошибок, а Ваш я не пробовал

  11. stas:

    помоги пожалуйста ….. 2 день с этой проблемой …

  12. stas:

    попробуй пож и напиши …

  13. stas:

    пожалуйста помоги мне с этой проблемой несколько дней уже сижу никак не могу решить ….отблагодарю в денежной форме если быстро поможешь решить …..

    • Andrey:

      в понедельник дам ответ, денег не надо, так как данный ресурс предназначен для получения и реения проблем путем бесплатных знаний

  14. stas:

    ок спасибо заранее

    • Andrey:

      необходимо библиотеки libeay32.dll и ssleay32.dll под Вашу версию Indy, а также компонент IdSocksInfo, в котором необходимо указывать версию и связать его надо с компонентом IdSSLIOHandlerSocket, в котором тоже надо похимичить со свойством MEthod

  15. stas:

    спасибо испробую …. я почти эту проблему решу если уберу » s » но вот если напишу верные данные то опять эта ошибка так как идет редирект ….ты не знаешь как сделать самому редирект ? тут простой гет запрос не поможет …

  16. stas:

    нет , я пробовал дает ошибку 302, а если включить редирект то такой ошибки нет

  17. stas:

    да …….не знаю уже что делать ….. попробовал с синапс поработать такой ошибки не дает но не могу получить исходник страницы ….потом с исходником сделаю проверку на авторизацию …у тебя скайп или ася есть ? помоги мне пожалуйста неделю как сижу с этой проблемой … мой скайп : admin-one1 icq:6035914 буду очень благодарен если поможешь мне ….только не игнорь я незнаю уже к кому обратится ….

  18. Все работает отлично, но вот возникла проблемка, что делать если пост запрос больше 255 симыолов при таком раскладе не компилируется, ругается на длину

  19. вот он запрос на ркгу в жж 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}’)););

  20. Денис:

    Добрый день, уже не знаю у кого спросить) Спрошу у Вас)
    Думаю Вы знаете что https нужен для шифрования отправляемых данных от клиента к серверу, и обратно. Если попробовать поснифать браузер открывающий сайт через https, ни чего не выйдет, просто снифер ни чего не покажет. Однако, если снифать программу написанную в Delphi (TIdHTTP+TIdSSLIOHandlerSocketOpenSSL), можно увидеть все запросы и все полученные данные. Пример http://s45.radikal.ru/i107/130.....767f32.png
    В связи с этим возникает вопрос, а не знаете ли Вы как можно победить это недоразумение? Уже на многих форум задал этот вопрос, ни кто не знает к сожалению.

  21. Данил:

    Доброго дня. Может мысли будут почему этот код работает под 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);

  22. stokkato:

    Подскажите, как можно с использованием вашего примера скачать файл с Дропбокса. Там так же используется защищенное соединение. Я пробовал процедурой get через поток. Но выходит ошибка. Знаю, что в wget подобная проблема устраняется указанием флага —no-check-certificate

  23. Пожалуйста киньте исходник данной проги, а то чето вообще не получается, столько ошибок выдал….

  24. AllexPtsk:

    Добрый день
    Я похоже столкнулся с проблемой которую вы решали со Stas-ом в 2012-ом. При выполнении Get вылетает ошибка, но нет ни номера ошибки, ни текста
    Project raised exception class EIdHTTPProtocolException with message ». Никак не могу понят в чем может быть проблема.

  25. Тоже столкнулся с подобной проблемой, но только на старых версиях среды разработки. Поставил RAD XE6 (там видимо компонент обновлен) — работает как с hhtp, так и https.

  26. Работаю с новыми версиями RAD XE6, никаких проблем с шифрованным протоколом не было. Автору отдельная благодарность за статью!

Оставить комментарий

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*