我有一些bind的实现,连接到SOCKS并通过SOCKS连接到SMTP服务器。我如何使用SSL / TLS NET :: SMTP连接?这个question对我没有帮助,因为SSL握手无法启动。
DEBUG: .../IO/Socket/SSL.pm:683: waiting for fd to become ready: SSL wants a read first
DEBUG: .../IO/Socket/SSL.pm:693: handshake failed because socket did not became ready
这里通过代理连接到远程服务器的实现:
sub connect {
my ($ip, $port, $is_ssl, $pid, $server) = @_;
if (defined $socket) {
my ($packed_cmd, $buffer, @data, %response);
$packed_cmd = pack("C4Nn", 0x05, 0x01, 0x00, 0x01, $ip, $port);
$socket->send($packed_cmd);
if (defined $socket->recv($buffer, 1024)) {
@data = unpack("C4 L S", $buffer);
$response{'version'} = $data[0];
$response{'result'} = $data[1];
$response{'reg'} = $data[2];
$response{'type'} = $data[3];
$response{'ip'} = $data[4];
$response{'port'} = $data[5];
$socket->blocking(0);
if ($is_ssl) {
&debug(3, $pid, "Try start SSL handshake with [$server]\n");
IO::Socket::SSL->start_SSL($socket, SSL_version => 'SSLv23', SSL_ca_file => SSL_CA_FILE) or &debug(3, $pid, "Cannot start SSL handshake! $@\n") and return 0;
&debug(3, $pid, "SSL handshake done!\n");
}
# TODO: Make TLS support
return 1;
}
}
&debug(3, $pid, "Cannot connect to [$server:$port] through socks server [$socks_name:$socks_server]\n");
return 0;
}
绑定SOCKS
sub bind_socks {
my ($pid) = @_;
my ($method, $packed_cmd, $buffer, @data, %response);
$socket = IO::Socket::INET->new(
PeerAddr => $socks_server,
PeerPort => $socks_port,
Proto => 'tcp',
Timeout => SOCKS5_CONNECT_TIMEOUT
) or &debug(3, $pid, "Cannot connect to the socks server [$socks_server] $@\n") and return 0;
&debug(3, $pid, "Connected to the socks server [$socks_name:$socks_server]\n");
$socket->blocking(1);
if ($socks_username && $socks_password) {
$method = 0x02;
} else {
$method = 0x00;
}
$packed_cmd = pack("C3", 0x05, 0x01, $method);
$socket->send($packed_cmd);
if (defined $socket->recv($buffer, 1024)) {
@data = unpack("C2", $buffer);
$response{'version'} = $data[0];
$response{'method'} = $data[1];
if ((defined $response{'version'}) && (defined $response{'method'}) && ($response{'version'} eq 5) && ($response{'method'} eq $method)) {
if ($method == 2) {
$packed_cmd = pack("CC", 0x01, length($socks_username)) . $socks_username . pack("C", length($socks_password)) . $socks_password;
$socket->send($packed_cmd);
if (defined $socket->recv($buffer, 1024)) {
@data = unpack("C2", $buffer);
$response{'version'} = $data[0];
$response{'status'} = $data[1];
return 1;
}
} else {
return 1;
}
} else {
&debug(3, $pid, "Cannot authenticate on socks server [$socks_name:$socks_server]\n");
return 0;
}
}
&debug(3, $pid, "Cannot authenticate on socks server [$socks_name:$socks_server]\n");
return 0;
}
答案 0 :(得分:0)
如果你对IMAP而不是SMTP没问题,这可能有所帮助,但不是你要找的东西:
sub login() {
## Connect to the IMAP server via SSL
my $socket = IO::Socket::SSL->new(PeerAddr => 'imap.gmail.com',PeerPort => 993);
if(!$socket) {
# handle
}
## Build up a client attached to the SSL socket.
## Login is automatic as usual when we provide User and Password
my $imap = Mail::IMAPClient->new(Socket => $socket,
User => $username,
Password => $password,);
if(!$imap) {
# handle
}
if(!$imap->IsAuthenticated() && ...) {
# handle
}
## good to go
my @folders = $imap->folders();
...
}
答案 1 :(得分:0)
Here是我通过socks代理使用SMTP的测试代码。 SSL可以正常使用我测试的所有服务器。有时TLS仍然存在问题,可能不符合RFC。