[英]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 類中。 這是獲得正確順序(例如發送)的唯一方法。 我需要首先調用 SSL 方法,然后它會調用父 (IO::Socket::Socks) 發送。 與連接相同,SSL 連接將調用 Socks 連接,然后啟動 TLS 協商。
不幸的是, IO::Socket::SSL 沒有 $SOCKET_CLASS 變量可以讓子類輕松決定它繼承自什么,所以我在 SSL.pm 中更改這一行並復制所有代碼
我可能在這里遺漏了一些東西
使用 TCP 的 SOCKS 代理(以及 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>;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.