如何从Node socket.io-client **通过HTTPS连接到节点socket.io-server **

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

/* 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> 

我怎样才能得到一个节点socket.io客户端通过HTTPS连接到节点socket.io-服务器?

Node.jsTLSHTTPS将在接受它们之前validation证书。 因此,要使用带有Node的自签名证书,在执行请求为false时需要设置rejectUnauthorized选项,或者使用:

 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 

解决scheme是将这一行添加到客户端:

process.env.NODE_TLS_REJECT_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_ZERO_SELF_SIGNED_CERT

Socket.io似乎无法为此提出请求。

谷歌search错误后,我发现这个网页 。

在那个页面上有人build议上面的解决scheme,这是有效的。

从本质上讲,我相信这是允许自签名证书,可能是“不安全的”。