使用TLSSocket和tls.connect的Node中的奇怪行为。
var port = 7000;
var host = '94.125.182.252'; //freenode
var tls = require('tls');
var net = require('net');
var socket = new net.Socket();
var secure;
secure = new tls.TLSSocket( socket, {
isServer: false,
rejectUnauthorized: false
});
// edit (left out of original post, but present in my test code, whoops)
secure.connect( {
port: port,
host: host
});
secure.setEncoding( 'utf8' );
secure.on( 'connect' , function() {
console.log( 'connected' );
})
.on( 'secureConnect', function() {
console.log( 'secure connect' );
})
.on( 'error', function( e ) {
console.log( 'error', e );
})
.on( 'data', function( data ) {
console.log( data );
});
if ( secure.isPaused() ) {
console.log( 'socket was paused' );
secure.resume();
}
这甚至没有尝试连接,也没有产生错误消息。我有wireshark监控,没有捕获任何活动。
另一种方法:
secure = tls.connect( {
rejectUnauthorized: false,
host: host,
port: port,
socket: socket
});
同样的故事,没有捕获,没有错误。如果我删除上面的socket: socket
方面,它将会连接。这有点意义,因为文档声明如果指定了套接字选项,它将忽略端口和主机。以上工作在我之前的Node版本(0.12.7)上。
如果我想使用现有套接字,我必须在调用tls.connect之前告诉它连接。
socket.connect( {
port: port,
host: host
});
secure = tls.connect( {
rejectUnauthorized: false,
socket: socket
});
这似乎不合适。 将连接套接字传递给tls.TLSSocket(套接字,...)似乎没有任何效果。 'connect'事件被触发,但我想这与TLSSocket无关。 我无法获得tls.TLSSocket(...)来处理之前的Node迭代。 单步执行节点调试并没有暴露任何明显的问题。
net.Socket([options])的选项在尝试连接之前似乎不接受用于配置的端口或主机,并且在传递给tls.connect之前尝试连接似乎反直觉。这表明这不是预期用途。
所以我的问题是:
我在tls.TLSSocket()上做错了什么,或者它可能是一个错误?
我是否正确地假设将现有套接字传递到tls.connect()是否已经建立了连接切换协议?如果没有,是什么方法分配端口和主机?
编辑:
根据建议:
secure = tls.connect( {
rejectUnauthorized: false,
socket: socket
});
socket.connect( {
port: port,
host: host
});
这很有效。
secure = new tls.TLSSocket( socket , {
isServer: false,
rejectUnauthorized: false
});
socket.connect( {
port: port,
host: host
});
不幸的是,这不起作用。发出'connect'事件,绝不是'secureConnect',也不会发出任何其他事件或数据。
答案 0 :(得分:3)
在前两个(非工作)示例中,您只创建了一个套接字,但从未开始实际连接它。在原始代码的末尾添加socket.connect();
,它应该可以正常工作。
tls.connect()
当传递普通套接字时,实际上并没有在内部调用socket.connect();
,它只是设置为开始侦听套接字上的数据,以便它可以正确解密传入的数据。