P
P
Puxta4ok2015-03-04 19:26:23
Perl
Puxta4ok, 2015-03-04 19:26:23

How to use NET::SMTP SSL/TLS over SOCKS?

I have specific implementations of bind, connect to SOCKS and connect to SMTP server via SOCKS. How can I use an already established connection with Net::SMTP? This answer didn't help me, I can't install SLL handshake.

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

Here is the method to connect to the server via SOCKS
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! [email protected]\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;
}

Here is the bind method
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] [email protected]\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;
}


That did n't work either, my proxy is stupidly ignored. (Of course I did this without the connect method).

I will be grateful for any help.

Answer the question

In order to leave comments, you need to log in

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question