我正在尝试在Node JS中实现TCP代理。我只有Java方面的经验,所以在此过程中遇到了很多问题。我已经做了很多搜索工作,但是没有运气。
我想为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 OK\r\n');
});
serverSock.on('data', function(serverData) {
clientSock.write(serverData);
});
}
}
});
});
如果访问https://www.google.com,我会使用Wireshark捕获发送的数据包。如果我不使用代理,则会在TLS v1.2中发送“ Client Hello”消息。但是,如果我使用我的代理,它是通过SSL发送的。服务器始终拒绝我的CONNECT请求并发送回重置请求。
我还尝试了Node JS中的TLS API。服务器接受了我的CONNECT请求,但始终要求我在密钥交换后开始新的会话。浏览器将关闭套接字并创建一个新的套接字。但是它从来没有加载过页面...
我花了整整一天的时间来解决这个问题。我相信我可以使用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 OK\r\n');
});
serverSock.on('data', function(serverData) {
clientSock.write(serverData);
});
}
}
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句