在 IO::Socket::SOCKS 代理上使用 IO::Socket::SSL
Using IO::Socket::SSL over an IO::Socket::SOCKS proxy
我想混合使用 SSL 和 SOCKS 套接字。换句话说,我想通过 SOCKS 代理发送 TLS 加密数据,我想使用 IO::Socket::SSL 和 IO::Socket::Socks
我能想到的唯一选择是将 IO::Socket::SSL 复制到继承自 IO::Socket::Socks 的 IO::Socket::SocksSSL class。这是获得正确订单(例如发送)的唯一方法。我首先需要调用 SSL 方法,然后它将调用父 (IO::Socket::Socks) 发送。对于连接,SSL 连接将调用 Socks 连接,然后开始 TLS 协商。
不幸的是,IO::Socket::SSL 没有 $SOCKET_CLASS var 允许子 class 轻松决定它继承自什么,所以我更改了这一行SSL.pm 并复制所有代码
我可能漏掉了什么
对 TCP(以及 SSL)使用 SOCKS 代理本质上意味着首先创建一个 TCP 套接字,进行一些初始 SOCKS 握手,然后像使用普通 TCP 套接字一样继续使用该套接字。 IO::Socket::Socks->new(...)
进行初始 SOCKS 握手,returns 进行普通的 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>;
我想混合使用 SSL 和 SOCKS 套接字。换句话说,我想通过 SOCKS 代理发送 TLS 加密数据,我想使用 IO::Socket::SSL 和 IO::Socket::Socks
我能想到的唯一选择是将 IO::Socket::SSL 复制到继承自 IO::Socket::Socks 的 IO::Socket::SocksSSL class。这是获得正确订单(例如发送)的唯一方法。我首先需要调用 SSL 方法,然后它将调用父 (IO::Socket::Socks) 发送。对于连接,SSL 连接将调用 Socks 连接,然后开始 TLS 协商。
不幸的是,IO::Socket::SSL 没有 $SOCKET_CLASS var 允许子 class 轻松决定它继承自什么,所以我更改了这一行SSL.pm 并复制所有代码
我可能漏掉了什么
对 TCP(以及 SSL)使用 SOCKS 代理本质上意味着首先创建一个 TCP 套接字,进行一些初始 SOCKS 握手,然后像使用普通 TCP 套接字一样继续使用该套接字。 IO::Socket::Socks->new(...)
进行初始 SOCKS 握手,returns 进行普通的 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>;