Использование IO :: Socket :: SSL поверх прокси IO :: Socket :: SOCKS - PullRequest
1 голос
/ 03 мая 2019

Я бы хотел смешать сокеты SSL и SOCKS.Другими словами, я хочу отправить зашифрованные данные TLS через прокси-сервер SOCKS, и я хотел бы использовать IO :: Socket :: SSL и IO :: Socket :: Socks

Единственный вариант, который я могу придуматьдолжен дублировать IO :: Socket :: SSL в класс IO :: Socket :: SocksSSL, который наследуется от IO :: Socket :: Socks.Это единственный способ получить правильный заказ (например, отправить).Сначала мне нужно вызвать метод SSL, а затем он вызовет родительскую отправку (IO :: Socket :: Socks).То же самое для соединения, где соединение SSL вызовет соединение Socks и затем начнет согласование TLS.

К сожалению, IO :: Socket :: SSL не имеет переменной $ SOCKET_CLASS, которая позволила бы подклассу легко решить, от чего он наследует, поэтому я должен изменить эту одну строку в SSL.pm и продублировать всекод

Я, наверное, что-то здесь упускаю

1 Ответ

1 голос
/ 03 мая 2019

Использование прокси-сервера SOCKS для TCP (и, следовательно, SSL), по сути, означает сначала создать сокет TCP, выполнить некоторое начальное рукопожатие SOCKS, а затем продолжить работу с сокетом, как с обычным сокетом TCP.IO::Socket::Socks->new(...) делает это начальное рукопожатие SOCKS и возвращает нормальный сокет TCP.IO::Socket::SSL->start_SSL($socket,...) затем выполняет квитирование TLS на этом сокете.Объединение обоих по существу делает то же самое, что и IO::Socket::SSL->new(...), только используя SOCKS-прокси вместо прямого соединения.

Таким образом, код может выглядеть примерно так:

use strict;
use warnings;
use IO::Socket::Socks;
use IO::Socket::SSL;

# establish TCP connection to target via SOCKS proxy
my $cl = IO::Socket::Socks->new(
    ProxyAddr => '127.0.0.1',
    ProxyPort => 1234,
    ConnectAddr => 'whatsmyip.net',
    ConnectPort => 443
) or die $!;

# upgrade the TCP socket to TLS
IO::Socket::SSL->start_SSL($cl,
    # hostname is needed for SNI and certificate validation
    SSL_hostname => 'whatsmyip.net'
) or die $SSL_ERROR;

# do a simple HTTP request on it
print $cl "GET / HTTP/1.0\r\nHost: whatsmyip.net\r\n\r\n";
print <$cl>;
...