Node JS TCP代理:使用Node JS设置HTTP隧道



我正在尝试在节点JS中实现TCP代理。我只有JavaScript的经验,所以一路上遇到了很多问题。我已经搜索了很多,但没有运气。

我想为HTTPS代理实现两跳TCP连接。这是我的代码的一部分。

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 OKrn');
                   });
                   serverSock.on('data', function(serverData) {
                        clientSock.write(serverData);
                   });
               }
          }
     });
 });

如果我访问https://www.google.com,我使用Wireshark捕获发送的数据包。如果我不使用代理,则在TLS v1.2中发送"客户端Hello"消息。但是,如果我使用代理,它将由SSL发送。服务器始终拒绝我的连接请求并发送回置请求。

我还尝试了节点JS中的TLS API。服务器接受了我的连接请求,但始终请求我在键交换后开始新的会话。浏览器将关闭插座并创建一个新的套接字。但是它从未加载页面...

我已经花了整整一天的时间来解决这个单一的问题。我相信我可以使用TCP插座实现HTTP隧道。请帮助...非常感谢!

解决问题!

使TCP套接字在处理HTTPS时使用TLS V1.2,只需将此选项{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 OKrn');
               });
               serverSock.on('data', function(serverData) {
                    clientSock.write(serverData);
               });
           }
      }
 });

最新更新