簡體   English   中英

在 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 類中。 這是獲得正確順序(例如發送)的唯一方法。 我需要首先調用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM