Node JS TCP Proxy: настройка HTTP-туннеля с использованием Node JS

Я пытаюсь реализовать TCP-прокси в Node JS. У меня есть только некоторый опыт работы с Javascript, поэтому я столкнулся с множеством проблем на этом пути. Я много искал этот, но не повезло.

Я хочу реализовать двухшаговое TCP-соединение для HTTPS-прокси. Вот часть моего кода.

var net = require('net');

var server = net.createServer(function(clientSock) {

    var connected = false;    

    var serverSock;

    clientSock.on('data', function(clientData) {

        if (connected) {

            // Send future messages if is connected
            serverSocet.write(clientData);

        } else {

            var host = // get from data
            var port = // get from data

            if (clientData is a CONNECT request) {

                // Create a new socket to server
                if (!serverSock) {
                    serverSock = new net.Socket();

                    serverSock.connect(port, host, function() {

                        // Send the CONNECT request (Client Hello)
                        serverSock.write(clientData);

                        connected = true;

                        clientSock.write('HTTP/1.1 200 OK\r\n');
                   });

                   serverSock.on('data', function(serverData) {
                        clientSock.write(serverData);
                   });
               }
          }
     });
 });

Я использовал Wireshark для захвата пакетов, отправляемых при посещении https://www.google.com. Если я не использую свой прокси-сервер, сообщение «Client Hello» отправляется в TLS v1.2. Но если я использую свой прокси, он отправляется по SSL. Сервер всегда отклоняет мой запрос CONNECT и отправляет обратно запрос на сброс.

Я также попробовал TLS API в Node JS. Сервер принял мой запрос CONNECT, но всегда просит меня начать новый сеанс после обмена ключами. Браузер закроет сокет и создаст новый сокет. Но он так и не загрузил страницу...

Я потратил целый день на эту единственную проблему. Я считаю, что могу использовать сокет TCP для реализации HTTP-туннеля. Пожалуйста, помогите... Большое спасибо!!


person KField    schedule 11.05.2015    source источник


Ответы (1)


Задача решена!

Чтобы сокет TCP использовал TLS v1.2 при работе с HTTPS, просто укажите эту опцию {allowHalfOpen: true} в качестве параметра при создании сокетов.

Новый код будет выглядеть так:

var net = require('net');

                               // option here
var server = net.createServer({allowHalfOpen: true}, function(clientSock) {

var connected = false;    

var serverSock;

clientSock.on('data', function(clientData) {

    if (connected) {

        // Send future messages if is connected
        serverSocet.write(clientData);

    } else {

        var host = // get from data
        var port = // get from data

        if (clientData is a CONNECT request) {

            // Create a new socket to server
            if (!serverSock) {

                                             // Option here
                serverSock = new net.Socket({allowHalfOpen: true});

                serverSock.connect(port, host, function() {

                    // Don't need to forward hello message from client
                    // Connect method automatically sends it for you
                    //serverSock.write(clientData);

                    connected = true;

                    clientSock.write('HTTP/1.1 200 OK\r\n');
               });

               serverSock.on('data', function(serverData) {
                    clientSock.write(serverData);
               });
           }
      }
 });
person KField    schedule 14.05.2015