Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.064 c
15-1184735259
Notebook
2007-07-18 09:07
2007.08.19
Как перезагрузить ноутбук?


1-1181499519
имя
2007-06-10 22:18
2007.08.19
RichEdit глюк


15-1185148150
Kostafey
2007-07-23 03:49
2007.08.19
С днем рождения ! 23 июля


1-1181366240
Чапаев
2007-06-09 09:17
2007.08.19
Что означает такая запись?


15-1184897351
Slider007
2007-07-20 06:09
2007.08.19
С днем рождения ! 20 июля 2007 пятница





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский