Пишу не большую проксю на perl, использую сокеты. Пытался найти примеры или любую удобоваримую для меня инфу в гугле, вышло плоховато( теперь пробую искать помощи у вас. С http после удовлетворения всех инструкций протокола socks5 идет хэдер, который отправил программа-клиент, а дальше все, как по маслу. С https после инструкций идут крокозяброчки) и что с ними делать не понятно) Я конечно ожидал увидеть что-то типа обычного хэдера только на порт 443 , но как я понял, программа-клиент сразу шифрует данные и передает их. Что с этими крокозяброчками делать? отсылать их в сокет на проксю (ответ приходит пустым к сожалению)? или мб там какие-то дополнительные инструкции?
PHP: <?php if(isset($_POST['query']) && isset($_POST['host'])) { header('Content-type: application/octet-stream'); @set_time_limit(0); $query = base64_decode(str_replace(' ', '+', $_POST['query'])); @list($host, $port) = @explode(':', base64_decode($_POST['host'])); if(!$port) {if (eregi("ssl:", $host) && !$port) {$port = 443;} else {$port = 80;}} if (!eregi("ssl", $host)){ $ip = gethostbyname($host); } else { $host=str_replace('@', ':', $host); $ip=$host; $port = 443; } if($fp = @fsockopen($ip, $port, $errno, $errstr, 20)) { fwrite($fp, $query); while(!feof($fp)) { $answer = fread($fp, 1024); echo $answer; } fclose($fp); } else { echo 'not connect'; } exit; } ?> $host передается в виде ssl@//ip , потом @ заменяется на : и в таком виде fsock делает к нему коннект. в переменной $query содержаться крокозябры, они приходят в base64 Код куда передаются крокозябры.
Какой ужас. А если сервер не захочет отправлять данные сразу после получения данных от клиента? Или если клиент еще захочет что то отправить по одному и тому же соединению? Он не сможет этого сделать, такой код совершенно не годиться для Socks сервера. Да и PHP не совсем удачный выбор для этой цели.
видел несколько подобных схем, они более менее функционируют, вот я и не пойму, почему у меня практически та же самая схема не работает. в перле потоки ветвятся форком. я его сделал соксом, но протоколы будут использоваться только хттп и хттпс.
Нет, твой способ нормально подходит для протоколов, которые работают по принципу запрос -> ответ -> закрытие соединения. То есть для http, в котором передается заголовок Connection: close все будет работать, а для https, наверное, нет.
как ни странно, https в такой схеме работает, хотя бы у HTTPTunnel_v1.2.1 и IndiaWebProxy , но мне они не подходят, вот и пишу свой. Connection: close тут не передается, в скрипт идет сразу то, что передает программа-клиент, т.е. крокозяброчки) и к гейту он тоже не передается)
Если Connection: close не передается, то скрипт повиснет где то на 30 сек. в лучшем случае тогда, когда клиент передает Connection: keep-alive и сервер оствляет соединение открытым.
Можно я вклинюсь в вашу увлекательную дискуссию? 1) А где здесь хоть что-то связанное с Socks прокси? 2) ТС, прочитайте, пожалуйста, что такое SSL соединения вообще и HTTPS в частности. Ключевые слова - шифрование, сертификаты, man-in-the-middle
Чуть-чуть продвинулся в изысканиях) нашел ошибку, теперь в ответ мне всегда приходит 400 бед риквест) Причем без хэдера, только тело ответа) вот страннота) может это фишка хттпс?
Подозреваю дело в теории - 7-ми уровневая модель оси TCP-IP. Можно послушать аудиозапись Гаспар Чилингаров, этого возможно будет достаточно. Разобраться с заворачиванием сокетов на локальную машину 127.0.0.1:1081 предположим.
По изучал теорию, гуглил всю ночь. в 7и уровневой модели ssl соит между http и tcp, т.е. просто шифруется http. По сути там сначала должен идти обмен ключами. А у меня кажется сразу в зашифрованном виде трафик идет, мне бы найти инструкцию по https, понятную как тут http://ru.wikipedia.org/wiki/SOCKS по соксам.