我有一个使用websockets的工作聊天应用程序。我想更进一步,并在我的连接上启用加密,但是当我用https打开http服务器时,我的连接开始失败。
我已经生成了一个我在所有网站上使用的自签名证书(在相同的TLD下,这意味着它是一个通配符证书)。我可以确认它是一个有效的证书,所以问题不应该存在。
这是有效的(未加密的)
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
处连接时,无法建立连接。
我在浏览器中为证书添加了一个例外,因为我的客户端页面和websocket服务器地址位于相同的tld和子域下。
可能是什么问题?
答案 0 :(得分:4)
仅将您想要连接到websocket的站点添加为异常是不够的。转到站点https://my.domain:port
(websocket地址)并将位置添加为异常。 (这当然是Firefox的必要步骤)
或者,您可以将证书管理器中的证书导入 Authorities 。
编辑:我可以告诉你什么对我有用。
> 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
。
答案 1 :(得分:0)
糟糕的做法加上糟糕的伐木习惯是导致问题的原因。
在打开新连接时,执行了一项检查以验证请求的来源,该请求已在其中进行了硬编码http://
,并且因为我是从安全页面(https://
)请求的,所以检查否更长的时间和连接是不可能的。