2016-04-04 6 views
0

Ich versuche den von meinem node.js-Server empfangenen Verkehr zu einer TLS-Verbindung zu tunneln. Ich habe einige Code wie folgt aus:So erstellen Sie einen TLS-Tunnel in Node.js

function tunnel() { 
    var c = tls.connect(443, 'myhost', {rejectUnauthorized: false}); 

    var server = net.createServer(function (socket) { 
    socket.addListener("connect", function() { 
     console.log("Connection from " + socket.remoteAddress); 
     //sync the file descriptors, so that the socket data structures are the same 
     c.fd = socket.fd; 
     //pipe the incoming data from the client directly onto the server 
     c.pipe(socket); 
     //and the response from the server back to the client 
     socket.pipe(c); 
    }); 

    socket.addListener("data", function (data) { 
     console.log("Data received from client"); 
    }); 

    socket.addListener("close", function() { 
     server.close(); 
    }); 
    }); 

    server.listen(7000); 
} 

Wenn ich es laufen und testen Sie es, ich sehe in meinem Terminal:

$ curl --insecure https://myhost:443 
hello world 

$ curl --insecure https://localhost:7000 
# nothing... just hangs 

In der Server-Konsole, ich sehe Data received from client, aber nie die connect Rückruf .

Bin ich auf dem richtigen Weg?

Antwort

0

Sockets zu einem connection Ereignishandler-Server übergeben (der Rückruf Du createServer() Pass) ist bereits verbunden, so wird es nie ein connect Ereignis (dh für Client-Sockets erstellt mit net.connect()/tls.connect()) sein.

Hier ist, was ein Proxy aussehen würde, dass akzeptiert nur eine Verbindung:

net.createServer(function(socket) { 
    server.close(); // Stop listening for additional connections 
    var upstream = tls.connect(443, 'myhost', {rejectUnauthorized: false}); 
    socket.pipe(upstream).pipe(socket); 
}).listen(7000); 

Ich möchte auch, dass rejectUnauthorized: false mit weisen darauf hin, nicht sicher ist. Wenn Sie das verwenden, da der Upstreamserver ein selbstsigniertes Zertifikat verwendet, sollten Sie stattdessen die Option ca für die selbstsignierte Zertifizierungsstelle festlegen. Dies ermöglicht Zertifikate, die von der CA signiert sind und MITM-Angriffe verhindern.

Verwandte Themen