![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
HTTPS через Socks [D7, Win2k, WinXP]
Del_ © (2006-11-08 14:37:00)Задача такая: нужно делать ряд запросов по протоколу хттпс, совершая все их через socks (версия 5). Нужен полный контроль над отправляемыми заголовками и отправляемыми/принимаемыми куками.
Пробовал IEHTTP, но он не держит соксы. Пробовал OverbyteICS, но там поддержка SSL стоит таких денег, которых у студента нет :(
Решил перейти на нелюбимые мною Indy. Использую idHTTP, IdSSLIOHandlerSocketOpenSSL, IdSocksInfo (пока не до куки-менеджера). Так вот, если сокс во всей этой цепочке не прописывать, то всё работает 50/50.... Иногда пишет "Connection closed Gracefully" (как избавиться не знаю :( ). А если прописывать сокс, то идёт Аксес виолэйшн :(
Форумчане, помогите решить эти проблемы пожалуйста! Либо часть из них, либо посоветуйте альтернативу... Заранее благодарен!
Sha (2007-01-10 17:21:00) [1]> mb293881 (10.01.07 16:31) [5]
"Индийцам" напиши.
mb293881 (2007-01-10 16:31:00) [2]После нудной работы с отладчиком я нашел, в чем проблема.
В юните IdSSLOpenSSL содержится баг, который дает о себе знать, если одновременно используется socks и идет попытка обращения к https://.
Заключается он в следующем. В данном компоненте при обычном обращении к сайту через сокс, перед самим обращением устанавливается соединение непосредственно с сокс-сервером посредством MakeSocks4Connection и MakeSocks5Connection, при этом общение с сокс-сервером производится через TIdSSLIOHandlerSocket.Recv и TIdSSLIOHandlerSocket.Send. Все это прекрасно работает, когда чтение и запись ведется в обычном режиме. Проблема появляется, когда нужно установить соединение через SSL. Производится попытка установления соединения с сокс-сервером теми же процедурами (TIdSSLIOHandlerSocket.Recv и TIdSSLIOHandlerSocket.Send), но в них есть условие, что при SSL-соединении нужно использовать другие процедуры для зашифрованной отправки и получения данных (RecvEnc и SendEnc), которые возможны через специальный ssl сокет, который создается ТОЛЬКО ПОСЛЕ установления связи с сокс-сервером! В итоге программа пытается обратиться к несозданному объекту fSSLSocket (равному nil), через который идет обращение ко внешним ssl-библиотекам, что и дает Access Violation. Т.е. нужно было сначала инициализировать канал для работы с сокс-сервером, а уж потом посылать и получать зашифрованные данные. Чтобы этого не происходило, нужно установить связь с сокс-сервером в обычном режиме, а уже только потом пользоваться командами для работы с зашифрованными данными.
Для решения данной проблемы я создал дополнительные процедуры в юните IdSSLOpenSSL:
function TIdSSLIOHandlerSocket.Recv1(var ABuf; ALen: integer): integer;
begin
result := inherited Recv(ABuf, ALen);
end;
function TIdSSLIOHandlerSocket.Send1(var ABuf; ALen: integer): integer;
begin
result := inherited Send(ABuf, ALen);
end;
А в юните IdSocks внес вот такие изменения.
Все обращения к send и recv внутри процедур MakeSocks4Connection и MakeSocks5Connection заменил на send1 и recv1. Т.е. в MakeSocks4Connection было:
FIOHandler.Send(LRequest, i);
Стало:
TIdSSLIOHandlerSocket(FIOHandler).Send1(LRequest, i);
Ну и так далее по аналогии. Это нужно, чтобы на момент установления связи с сокс-сервером общение с ним шло не через шифрованный канал, а обычным способом.
После вышеописанных изменений все заработало.
mb293881 (2007-01-09 17:52:00) [3]Del_, не разобрался еще с этим? У меня тот же самый вопрос.
Я пытаюсь настроить компонент Indy idhttp для работы по SSL
с использованием сокс-сервера. Используется Delphi 2005 10.0.2151.25345 и Indy 9. Требуется открыть сайт через idhttp.get('https://www.microsoft.com/en/us/default.aspx')
Для этого создал IdSSLIOHandlerSocket, IdSocksInfo, IdHTTP, взаимно их связал. Библиотеки для поддержки SSL в Indy загружены, версия 0.9.6m.
При указании сокса и порта и выполнении операции Get выдается следующая ошибка:
Project raised exception class EAccessViolation with message
'Access violation at address 00475AB8 in module xxxx.exe.'
Read of address 00000014'.
В дебагере ошибка указывает сюда:
ntdll.RtlConvertUlongToLargeInteger + 0x3b
При отключении сокса (в SocksInfo устанавливаю Version:=svNoSocks) сайт открывается без ошибок.
При подключении сокса, но при отключенном SSL режиме (просто http://) сайт также открывается нормально.
При одновременном https:// и наличии сокс-сервера выдается ошибка.
Вот исходный код:
type
TForm1 = class(TForm)
IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket;
IdSocksInfo1: TIdSocksInfo;
IdHTTP1: TIdHTTP;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
s:string;
begin
idsocksinfo1.Host:=адрес сокса;
idsocksinfo1.Port:=порт;
idsocksinfo1.version:=svsocks5;
s:=idhttp1.get('https://www.microsoft.com/en/us/default.aspx'); // ошибка выдается при выполнении get
end;
Скорее всего, это баг в IdSSLIOHandlerSocket
Или что-то надо просто поменять?
Del_ (2006-11-08 18:16:00) [4]1) ы книге прочёл, что данное исключение происходит в случае, если сервер разорвал соединение... А с протоколами хттп/хттпс, если я не ошибаюсь, это обычное дело... Вот только данные ответа компонент не возвращает (тем не менее, судя по показаниям идущего трафика, они есть). Сейчас поищу исходники модулей и посмотрю что и как...
2) сокс прописываю в IdSocksInfo, выставляя там соответствующие параметры для него. А в IdSSLIOHandlerSocketOpenSS выставляю IdSocksInfo в параметре TransprentProxy (вроде так называется).
Есть небольшое сомнение, что идёт попытка шифровать траффик с соксом, а не траффик с сайтом через сокс. Хотя не думаю :/
umbra (2006-11-08 15:57:00) [5]а где Вы сокс прописываете?
Reindeer Moss Eater (2006-11-08 14:54:00) [6]Иногда пишет "Connection closed Gracefully" (как избавиться не знаю :( ).
Читать доку или модуль который открытвается в IDE при этом исключении.