这是我的服务器端:
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中工作正常(唉!)但是当它在chrome中使用它时会死掉:
GET https://labs.domain.com:1234/socket.io/?EIO=3&transport=polling&t=1463123926844-3 net::ERR_INSECURE_RESPONSE
如果我删除它的HTTPS方面,它在两种浏览器中都可以正常工作。
这很令人沮丧,因为它似乎只是Chrome的一个问题,这是我最常用的浏览器。我该如何解决这个问题?
答案 0 :(得分:2)
如果证书存在任何问题,我的Chrome浏览器不允许安全的websocket连接。通过使用通过LetsEncrypt获得的证书,我能够在这里使用我们的应用程序获得socket.io。我并不是说这是唯一的方法,但这是我们(工作)配置的设置方式:
1 - 我和我的队友都有动态DNS设置指向我们的每台开发机器(例如:mac.example.com)
2 - 我们每个人都为我们的域设置了证书(例如mac.example.com),从LetsEncrypt获得;这样做的原因是Chrome在设置WebSockets时对您使用的证书非常挑剔,而且(目前)开发人员或最终用户无法覆盖和接受不太安全/自签名的证书。 / p>
3 - 我们在node.js应用程序中配置socket.io的代码如下:
const server = https.createServer(/* ssl options: cert etc. */, myExpressApp)
const io = require('socket.io')(server)
我们正在使用socket.io v1.4.6
听起来你问题的问题是你的服务器上已经设置了证书,但Chrome仍然会抱怨它们。这可能是罪魁祸首,听起来你可能没有sysadmin特权来改变它?
TL; DR 请勿使用Chrome认为可能认为的自签名证书或证书&#34;较少&#34;安全