Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2012, 11:18   #1
Maxwellion
Новичок
Джуниор
 
Регистрация: 18.02.2011
Сообщений: 1
По умолчанию INDY + HTTPS + SSL

Здравствуйте.
Проблема тривиальна: нужно обменяться ПОСТ запросами с сервером, по HTTPS с использованием сертификатов.
Форум читал, схожих тем много, но все они немного не подходят. Или я чего-то не допонимаю.
Чаще встречаются темы без использования сертификатов, мне нужно подключится с использованием сертификата, есть темы где говорится про 3 сертификата(cert, key и root), у меня он только 1 (cert.pem). Ещё один ко мне ломится когда я обращаюсь на сервер, я так понимаю мне его нужно принять и доверится ему, как это сделать я не понимаю.
Выдаёт ошибку.
Подскажите решение проблемы. Или направте на путь истиный, тему укажите схожую, хоть что нибудь, хоть чем нибудь помогите.
В SSL и сертификатах очень плохо понимаю(практически ничего не понимаю).

Вот что у меня получилось на данный момент: форма с двумя компонентами IdHTTP и IdSSLIOHandlerSocketOpenSSL

Использую.
DELPHI 2010
INDY 10.5.5

Код:
var
  data: TIdMultiPartFormDataStream;
begin

  data := TIdMultiPartFormDataStream.Create;
  data.AddFormField('REQ_TYPE', 'check');
  data.AddFormField('REQ_ID', '1');

Memo1.Text := idhttp1.Post('https://193.47.87.73/espp/test/uni',data);
Код:
  object IdHTTP1: TIdHTTP
    IOHandler = IdSSLIOHandlerSocketOpenSSL1
    AllowCookies = True
    HandleRedirects = True
    ProxyParams.BasicAuthentication = False
    ProxyParams.ProxyPort = 0
    Request.ContentLength = -1
    Request.Accept = 'text/html, */*'
    Request.BasicAuthentication = False
    Request.UserAgent = 'Mozilla/3.0 (compatible; Indy Library)'
    HTTPOptions = [hoForceEncodeParams]
    Left = 40
    Top = 32
  end
  object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL
    MaxLineAction = maException
    Port = 0
    DefaultPort = 0
    SSLOptions.RootCertFile = 'D:\cert.pem'
    SSLOptions.CertFile = 'D:\cert.pem'
    SSLOptions.Method = sslvSSLv3
    SSLOptions.Mode = sslmUnassigned
    SSLOptions.VerifyMode = []
    SSLOptions.VerifyDepth = 0
    Left = 40
    Top = 80
  end

Выдаёт ошибку
Цитата:
First chance exception at $7C812AFB. Exception class EIdOSSLUnderlyingCryptoError with message
'Error connecting with SSL.
Error connecting with SSL.
error:140943F2:SSL routines:SSL3_READ_BYTES:sslv3 alert unexpected message'.
Process Project2.exe (2628)
Maxwellion вне форума Ответить с цитированием
Старый 08.05.2012, 22:49   #2
NoName013
 
Регистрация: 08.05.2012
Сообщений: 5
По умолчанию

Возможно этот текст вам поможет. Автор J-Fobos.

Цитата:


Для начала немного теории.
SSL — криптографический протокол, который обеспечивает установление безопасного соединения между клиентом и сервером.
HTTPS — расширение протокола HTTP, поддерживающее шифрование. Данные, передаваемые по протоколу HTTPS, «упаковываются» в криптографический протокол SSL или TLS, тем самым обеспечивается защита этих данных. В отличие от HTTP, для HTTPS по умолчанию используется TCP-порт 443.

Более подробно написано в википедии (SSL, HTTPS), рекомендую ознакомится.

А теперь к практике.
Во первых нам потребуется два компонента с пакета indy, а именно TIdHTTP (Indy Clients) и TIdSSLIOHandlerSocketOpenSSL (Indy I/O Handlers). Если, будете создавать компоненты в run-time, то не забывайте подключать в Uses модули IdSSL, IdSSLOpenSSL.
IdHTTP1.IOHandler:=IdSSLIOHandlerSo cketOpenSSL1; //эта строка в комментариях не нуждается

Во вторых нам надо библиотеки Openssl. Всего две из целого набора: libeay32.dll и ssleay32.dll. Поэтому можно качать lite версию. Согласно документации библиотеки нужно закинуть в системный каталог винды (папку system32), но я держу их в папке с проектом и рекомендую держать их именно там (чуть ниже объясню почему).

Ну, а финалом этой "сложной" работы будет успешное выполнение кода:

Код:
var
   html:String;
begin
   html:=idHTTP1.Get('https://адрес сайта');
   ShowMessage(html);
end;
Все довольно просто, единственная проблема с которой вы можете столкнутся - не совпадение версий библиотек openssl и indy.
В разных версиях - разные точки входа и возможно немного отличаются имена и аргументы функций и ваша программа не сможет правильно работать (или вообще работать). Именно по причине несовпадения версий я рекомендую держать dll-ки вместе с проектом, у юзера в системе могут быть уже установлены библиотеки другой версии (или их может вообще не быть в системе) и программа даст сбой.
У меня прекрасно работает связка indy 10.5.8 + openssl 1.0.1 (самые новые на момент создания темы). Если у вас другие версии, то либо обновите инди, либо качайте более старые библиотеки openssl.

Желаю успешных get/post запросов
NoName013 вне форума Ответить с цитированием
Старый 30.01.2013, 03:07   #3
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

А у меня вот такая вот ерунда вылазиет при методе POST.
http/1.0 405 method not allowed

Что это могло быть?
VintProg вне форума Ответить с цитированием
Старый 30.01.2013, 03:49   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

сервер точно ждет POST?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.01.2013, 13:03   #5
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Да я через плагин Temper data получил. какие параметры в посте отправлялись...
VintProg вне форума Ответить с цитированием
Старый 16.01.2014, 16:45   #6
jagyjagy
Новичок
Джуниор
 
Регистрация: 17.12.2010
Сообщений: 1
По умолчанию

Цитата:
Сообщение от NoName013 Посмотреть сообщение
Возможно этот текст вам поможет. Автор J-Fobos.
доброго дня.
может поможете....
трабла следующая: требуется GET запросом получить данные от сервера посредством HTTPS .
IDE - Embarcadero Delphi XE5.
собственно проблема в том, что компилируясь под win32 или Android все работает замечательно, при компиляции под iOS (проверяю на 5S и iPad mini, оба ios 7) тупо все зависает на IdHTTP.get (.... ...)
код прост
IdHandler := TIdSSLIOHandlerSocketOpenSSL.Create (nil);
IdHTTP := TIdHTTP.Create(nil);
IdHTTP.IOHandler := IdHandler;
rcvrdata := TMemoryStream.Create;
xreq := 'HTTPS://mail.tut.by';
IdHTTP.get (xreq,rcvrdata);
----
дополнительные странные на мой взгляд симптомы:
устанавливая Read или Connection TimeOut менее 100(0,1 Сек) - то в Exception получу вылет по TO, что логично! если же > 100 , то как будто выставляю в 0 - т.е. реакция как будто бесконечны они ...

Последний раз редактировалось jagyjagy; 16.01.2014 в 16:49.
jagyjagy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SSL соединение в Indy IQDDD Работа с сетью в Delphi 3 04.04.2013 21:39
Indy SSL metra52 Работа с сетью в Delphi 2 10.04.2012 18:44
И снова сертификаты, или ssl+delphi+https Lothar Работа с сетью в Delphi 4 04.05.2011 08:23
HTTPS,SSL <-----Помогите разобраться nigma143 Работа с сетью в Delphi 14 07.07.2010 10:14
Delphi 7 + .NET web services + SSL(https) dreadangel Работа с сетью в Delphi 2 28.04.2009 15:10