Форум: "Сети";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
ВнизHTTPS через Socks Найти похожие ветки
← →
Del_ (2006-11-08 14:37) [0]Задача такая: нужно делать ряд запросов по протоколу хттпс, совершая все их через socks (версия 5). Нужен полный контроль над отправляемыми заголовками и отправляемыми/принимаемыми куками.
Пробовал IEHTTP, но он не держит соксы. Пробовал OverbyteICS, но там поддержка SSL стоит таких денег, которых у студента нет :(
Решил перейти на нелюбимые мною Indy. Использую idHTTP, IdSSLIOHandlerSocketOpenSSL, IdSocksInfo (пока не до куки-менеджера). Так вот, если сокс во всей этой цепочке не прописывать, то всё работает 50/50.... Иногда пишет "Connection closed Gracefully" (как избавиться не знаю :( ). А если прописывать сокс, то идёт Аксес виолэйшн :(
Форумчане, помогите решить эти проблемы пожалуйста! Либо часть из них, либо посоветуйте альтернативу... Заранее благодарен!
← →
Reindeer Moss Eater © (2006-11-08 14:54) [1]Иногда пишет "Connection closed Gracefully" (как избавиться не знаю :( ).
Читать доку или модуль который открытвается в IDE при этом исключении.
← →
umbra © (2006-11-08 15:57) [2]а где Вы сокс прописываете?
← →
Del_ (2006-11-08 18:16) [3]1) ы книге прочёл, что данное исключение происходит в случае, если сервер разорвал соединение... А с протоколами хттп/хттпс, если я не ошибаюсь, это обычное дело... Вот только данные ответа компонент не возвращает (тем не менее, судя по показаниям идущего трафика, они есть). Сейчас поищу исходники модулей и посмотрю что и как...
2) сокс прописываю в IdSocksInfo, выставляя там соответствующие параметры для него. А в IdSSLIOHandlerSocketOpenSS выставляю IdSocksInfo в параметре TransprentProxy (вроде так называется).
Есть небольшое сомнение, что идёт попытка шифровать траффик с соксом, а не траффик с сайтом через сокс. Хотя не думаю :/
← →
mb293881 (2007-01-09 17:52) [4]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
Или что-то надо просто поменять?
← →
mb293881 (2007-01-10 16:31) [5]После нудной работы с отладчиком я нашел, в чем проблема.
В юните 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);
Ну и так далее по аналогии. Это нужно, чтобы на момент установления связи с сокс-сервером общение с ним шло не через шифрованный канал, а обычным способом.
После вышеописанных изменений все заработало.
← →
Sha © (2007-01-10 17:21) [6]> mb293881 (10.01.07 16:31) [5]
"Индийцам" напиши.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c