Chrome,NodeJS和HTTPS

这是我的服务器端:

var fs = require('fs'); var options = { key: fs.readFileSync('/cert.key'), cert: fs.readFileSync('/cert.crt') }; var app = require('express')(); var http = require('https').Server(options, app); var io = require('socket.io')(http); var port = 1234; app.get('/', function(req, res){ res.sendFile(__dirname + '/../subdomains/labs/socketio.html'); }); io.on('connection', function(socket){ socket.on('chat message', function(msg){ io.emit('chat message', msg); }); }); http.listen(port, function(){ console.log("\n\n--------------------------------"); console.log('Currently Listening on port %d',port); console.log("--------------------------------\n\n"); }); 

而我的客户端:

 <script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> <script src="https://code.jquery.com/jquery-1.11.1.js"></script> <script> var socket = io('https://labs.domain.com:1234'); $('form').submit(function(){ socket.emit('chat message', $('#chat-message').val()); $('#chat-message').val(''); return false; }); socket.on('chat message', function(msg){ $('#messages').append($('<li>').text(msg)); }); </script> 

所有在Internet Explorer中工作正常(agh!)但是在chrome中使用它会死:

 GET https://labs.domain.com:1234/socket.io/?EIO=3&transport=polling&t=1463123926844-3 net::ERR_INSECURE_RESPONSE 

如果我删除了它的HTTPS方面,它在两个浏览器都能正常工作。

这是相当令人沮丧的,因为它似乎只与Chrome,这是我使用的浏览器最多的问题。 我怎样才能解决这个问题?

如果Chrome存在任何问题,则Chrome浏览器不支持安全的WebSocket连接。 我可以通过使用通过LetsEncrypt获得的证书来使socket.io与我们的应用程序一起工作。 我并不是说这是做这件事的唯一方法,但是我们的(工作)configuration是如何设置的:

1 – 我和我的队友都有dynamicDNS设置,指向我们的每个开发机器(例如:mac.example.com)

2 – 我们每个都有为我们的域设置的证书(例如mac.example.com),从LetsEncrypt获得; 原因是Chrome对设置WebSockets时使用的证书超级挑剔,开发人员或最终用户无法(当前)覆盖并接受不太安全/自签名的证书。

3 – 我们在node.js应用程序中configurationsocket.io的代码如下所示:

 const server = https.createServer(/* ssl options: cert etc. */, myExpressApp) const io = require('socket.io')(server) 

我们使用的是socket.io v1.4.6

这听起来像你的问题是证书是在你的服务器上设置的,但是Chrome仍然抱怨他们。 这可能是罪魁祸首,听起来你可能没有系统pipe理员权限来更改它?

TL; DR不要使用Chrome可能认为“不太安全”的自签名证书或证书。