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

  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. ABTOP:

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

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

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

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

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

    • Andrey:

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

  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 ». Никак не могу понят в чем может быть проблема.

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

Вы можете использовать следующие теги:

*