2016-09-22 98 views
11

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

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

这是什么工作(未加密)

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

防火墙问题? –

回答

0

糟糕的做法加上不良的日志习惯是导致问题的原因。

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

4

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

或者,您可以将证书导入到证书管理器中,导入单位

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

> 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 

https://localhost:8000设定通用名为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)(加入证书作为例外)

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

和接收test received

+0

我最近从letsencrypt获得了可信证书,并且可以在我的节点http和ws服务器正在侦听的'https://my.domain:port'连接,但连接仍然失败。 –

+0

@php_nub_qq错误信息说什么? – Adam

+0

连接在Chrome中被拒绝,连接无法在Firefox中建立。 –