WebSocket服务器不适用于SSL

php*_*_qq 11 ssl http websocket node.js

我有一个使用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
});
Run Code Online (Sandbox Code Playgroud)

使用这个我现在可以连接到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
});
Run Code Online (Sandbox Code Playgroud)

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

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

可能是什么问题呢?

Ada*_*dam 7

将要连接到 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
Run Code Online (Sandbox Code Playgroud)

将通用名称设置为 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);
});
Run Code Online (Sandbox Code Playgroud)

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

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

并收到test received


php*_*_qq 1

不良做法加上不良伐木习惯是问题的根源。

打开新连接时,会执行一项检查来验证已硬编码http://在其中的请求的来源,并且由于我是从安全页面 ( https://) 请求它,因此检查不再通过,连接也无法实现。