WebSocket服务器不支持SSL

我有一个使用websockets的工作聊天应用程序。 我想更进一步,并在我的连接上启用encryption,但是当我使用https连接到http服务器时,我的连接开始失败。

我在我的所有网站(在同一顶级域名(TLD)下提供了自签名证书,这意味着它是通配证书)。 我可以确认这是一个有效的证书,所以问题不应该在那里。

这是什么工作(未encryption)

var webSocketServer = require('websocket').server; var http = require('http'); var server = http.createServer(function() {}); server.listen(webSocketsServerPort, function () { log("system", "Server is listening on port " + webSocketsServerPort); }); var wsServer = new webSocketServer({ httpServer: server }); 

现在我可以连接到ws://my.domain:port

这是不行的

 var webSocketServer = require('websocket').server; var http = require('https'); var fs = require('fs'); var server = http.createServer({ key: fs.readFileSync("path/to/host.key"), cert: fs.readFileSync("path/to/host.pem") }); server.listen(webSocketsServerPort, function () { log("system", "Server is listening on port " + webSocketsServerPort); }); var wsServer = new webSocketServer({ httpServer: server }); 

使用此代码服务器也启动,我看到日志消息“服务器正在侦听..”,但是当我尝试连接在wss://my.domain:port连接无法build立。

我在浏览器中为证书添加了一个exception,因为我的客户端页面和websocket服务器地址在同一个tld和子域下。

可能是什么问题呢?

将您想要连接到websocket的站点添加为例外是不够的。 转到站点https://my.domain:port (websocket地址),并将该位置添加为例外。 (这当然是Firefox的必要步骤)

或者,您可以将证书pipe理器中的证书导入到“ 权限”中

编辑:我可以告诉你什么对我有用。

 > openssl genrsa -out key.pem > openssl req -new -key key.pem -out csr.pem > openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem 

将通用名称设置为localhost

main.js

 var https = require('https'); var ws = require('websocket').server; var fs = require('fs'); var options = { key:fs.readFileSync('key.pem'), cert:fs.readFileSync('cert.pem') }; var server = https.createServer(options, function(req,res){res.writeHeader(200);res.end();}); server.listen(8000); var wss = new ws({httpServer:server}); wss.on('request',function(req){ req.on('requestAccepted',function(conn){ conn.on('message',function(msg){ conn.send(msg.utf8Data + " received"); }); }) req.accept(null,req.origin); }); 

然后在浏览器(Firefox)的https://localhost:8000 (添加证书作为例外)

 var ws = new WebSocket('wss://localhost:8000/') ws.onmessage = function(msg){console.log(msg.data)} ws.send("test") 

并收到test received

糟糕的做法加上不良的日志习惯是造成这个问题的原因。

在打开一个新的连接时,执行了一个检查来validation在那里硬编码为http://的请求的来源,因为我是从一个安全的页面( https:// )请求的,检查不再通过,连接是不可能。