WinSock + SSL
, Требуется подключиться к серверу, отправить запрос и прочитать результат
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.123] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
WinSock + SSL
, Требуется подключиться к серверу, отправить запрос и прочитать результат
|
Сообщ.
#1
,
|
|
|
|
Здравствуйте, посмотрел по поиску https, libeay32.dll, есть несколько тем, даже то что нужно есть но принципа реализации нету.
В интернете так же есть куча статей, исходников и тд, перекачал кучу попробовал но требуемого результат не получил по причине полного непонимания этого дела. Может кто готов немного научить? Вопрос следующий: Сейчас в интернете полно сайтов на которых вместо http стало https. Раньше все было просто коннектимся к серверу, передаем в сокет данные, читаем и при необходимости отключаемся или передаем/читаем далее. Сниффером можно было все запросы посмотреть составить аналогичные для требуемого сервера и работать с ним без всяких заморочек. Сейчас сниффером мне даже не посмотреть собственно саму структуру GET/POST запроса, одни крикозябли. По скольку в шифровании я полный 0, начал искать хоть какой то исходник что бы можно было хоть с чего то начать, нашел 1 который после долгих и упорных замен библиотек libeay32.dll, ssleay32.dll исходник запустился, но требуемого эффекта не получил. Соединение проходит, но после отправки GET запроса при чтении сокета размер входящих данных = -1 что означает что соединение было закрыто сервером. Вот хочется понять с чего вообще надо начинать разбираться стим https? (я вычитал что там после соединение еще одно соединение надо открывать, и в примере там что то открывается) ![]() ![]() function SSL_connect(ssl: pointer):Integer; cdecl; external SSL_LIB_NAME; function TSLESH_SSL_Socket.Connect(ip:string; port:word):boolean; var nip:integer; phe:PHostEnt; begin result := false; sock := socket(AF_INET, SOCK_STREAM, 0); ErrorFlag := sock = INVALID_SOCKET; // если сокет создался if (ErrorFlag = false) then begin nip := inet_addr(pansichar(ip)); if nip = INADDR_NONE then // если указано доменное имя а не IP begin // резолвим имя phe := gethostbyname(pansichar(ip)); if phe <> nil then begin nip := integer(pointer(phe^.h_addr^)^); end; end; // если есть адрес сервера if nip <> INADDR_NONE then begin caddr.sin_family := AF_INET; caddr.sin_addr.s_addr := nip; caddr.sin_port := htons(port); // коннектитмся if winsock.connect(sock, caddr, sizeof(caddr)) <> SOCKET_ERROR then begin // если сконнектились то настраиваем SSL SSL_set_fd(ssl, sock); SSL_connect(ssl); result := true; end; end; end; Connected := result; end; Но хотя бы первый вопрос откуда я знаю как составлять тот же запрос к серверу? ![]() ![]() GET / HTTP/1.0 или GET / HTTP/1.1 ?? User-Agent ??? и тд Сорри не умею точно описывать проблему, прошу не ругаться... (Есть конечно вариант на VDS читать все что надо по средствам PHP а потом эти данные уже программой запрашивать и обрабатывать но это не особо вариант) - Подключиться по средствам сокетов к серверу на 443 порт без проблем А что далее делать? |
|
Сообщ.
#2
,
|
|
|
|
Пока ждал ответа решил попробовать Indy. Вот в таком виде вроде работает:
![]() ![]() procedure TForm1.Button1Click(Sender: TObject); Var HTTP:TidHTTP; IdSSLOpenSSL:TIdSSLIOHandlerSocketOpenSSL; Data:String; begin HTTP:=TidHTTP.Create(nil); IdSSLOpenSSL:=TIdSSLIOHandlerSocketOpenSSL.Create(nil); HTTP.HandleRedirects:=True; IdSSLOpenSSL.SSLOptions.Method:= sslvSSLv3; IdSSLOpenSSL.SSLOptions.Mode := sslmUnassigned; IdSSLOpenSSL.SSLOptions.VerifyMode := []; IdSSLOpenSSL.SSLOptions.VerifyDepth := 0; HTTP.IOHandler:=IdSSLOpenSSL; Data:=HTTP.Get('https://firstvds.com'); Memo1.Text := Data; IdSSLOpenSSL.Free; HTTP.Free; end; Но это компанеты, а интересуют именно сокеты. |
|
Сообщ.
#3
,
|
|
|
|
Не влезал в эту тему, но если бы для успешного коннекта достаточно было всего двух вызовов функций, никто бы ничего и не спрашивал. В ICS, напрмиер, код работы с SSL занимает чуть ли не столько же, сколько базовый код по сокетам. Так что советую подумать, так ли обязательно делать все самому, а не применить готовый код.
|
|
Сообщ.
#4
,
|
|
|
|
Компоненты индейцев могут вызвать краши и баги.
Рекомендую пользоваться OverbyteIcs бесплатный набор компонентов для работы с Socket (есть поддержка SSL). |
|
Сообщ.
#5
,
|
|
|
|
Только ICS асинхронный, что несколько сложнее для понимания и проектирования.
Для снифа SSL можно юзать Fiddler или Wireshark. |
|
Сообщ.
#6
,
|
|
|
|
В WinAPI есть функционал как SSL-сервера, так и SSL-клиента, абстрагированный от каких-либо сокетов.
Называется schannel http://msdn.microsoft.com/en-us/library/wi...3(v=vs.85).aspx |
|
Сообщ.
#7
,
|
|
|
|
Посмотрел ссылку, спасибо. Что-то очень на RSA смахивает.
(Установление безопасного сеанса с помощью TLS) А может где то есть более конкретные структуры пакетов? ![]() ![]() (например: 2.Сервер отвечает, отправляя сообщение «hello Server» для клиента, а также случайное значение сервера. А как пакет выглядеть должен?) Это как я понимаю так же как в RSA Client Random и Server Random на основании которых создаются закрытый и открытый ключи? Очень похоже по крайней мере. Ну То что много писать это уже другой вопрос, в конце концов я просто хочу понять реально это реализовать или нет хотя бы для конкретного сайта например без реализации доп функций что бы везде работало. И может я не совсем точно выразился, я привел в начале пару библиотек для работы с SSL, с их же использованием не надо будет реализовывать кучу всего и использовать тот же инди? (я посмотрел но не вижу путевого описания как ими пользоваться) |