Node.js 如何使用HTTPS从Node socket.io-client**连接到Node socket.io-server**

Node.js 如何使用HTTPS从Node socket.io-client**连接到Node socket.io-server**,node.js,sockets,socket.io,Node.js,Sockets,Socket.io,我设置了一个套接字服务器,如下所示: /* node-server.js */ var port = 3333; var fs = require('fs'); var options = { key: fs.readFileSync('ssl/server.key'), cert: fs.readFileSync('ssl/server.crt') }; var server = require('https').Server(options); var io = requir

我设置了一个套接字服务器,如下所示:

/* node-server.js */
var port = 3333;
var fs = require('fs');
var options = {
    key: fs.readFileSync('ssl/server.key'),
    cert: fs.readFileSync('ssl/server.crt')
};
var server = require('https').Server(options);
var io = require('socket.io')(server);
console.log('Socket server listening on port ' + port + '.');
server.listen(port);
io.sockets.on('connection', function(socket) {
    console.log("Client " + socket.id + " connected.");
});
以及连接到它的节点客户端:

/* node-client.js */
var url = 'https://localhost:3333';
console.log('Connecting to ' + url);
var io = require('socket.io-client');
var socket = io.connect(url, { reconnection: false });
socket.on('connect_error', function(error){ console.log('Error connecting to ' + url, error);});
socket.on('connect', function() {
    console.log('Connected to ' + url);
});
但是,当尝试连接时,我得到一个错误
{[error:xhr poll error]description:503}

这个错误消失了,如果我删除“HTTPS”组件,一切都正常

但是,我不认为HTTPS是问题所在,因为这里有另一个客户端(这个客户端位于浏览器中,而不是节点中),可以很好地连接:

<!DOCTYPE html>
<html>
<head>
    <script type="text/javascript"
        src="https://localhost:3333/socket.io/socket.io.js"></script>
</head>
<body onload="io.connect('https://localhost:3333');">
</body>
</html>


如何使Node socket.io-client通过HTTPS连接到Node socket.io-server?

解决方案是将以下行添加到客户端:

process.env.NODE\u TLS\u REJECT\u UNAUTHORIZED=“0”

我发现如果我手动向套接字服务器发出HTTPS请求:

var https = require('https');
var options = { host: 'localhost',
    port: '3333',
    path: '/socket.io/?EIO=3&transport=polling&t=1404103832354-0&b64=1',
    method: 'GET',
    headers:
    { 'User-Agent': 'node-XMLHttpRequest',
    Accept: '*/*',
    Host: 'localhost:3333' },
    agent: false
};
https.globalAgent.options.rejectUnauthorized = false;
https.request(options, function() {
    console.log(arguments);
    throw 'done';
});
…然后请求将失败,错误为:
DEPTH\u ZERO\u SELF\u SIGNED\u CERT

由于这个原因,Socket.io似乎无法发出请求

在谷歌搜索错误后,我发现了

在那一页上,有人提出了上面的解决方案,这是可行的


本质上,我认为它允许自签名证书,这可能是“不安全的”。
Node.js
TLS
HTTPS
将在接受证书之前验证证书。因此,要在节点上使用自签名证书,您需要在执行对
false
的请求时设置
rejectUnauthorized
选项,或者使用:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

值得注意的是,此问答仅处理自签名证书。