在 SSL 上使用 BinaryJS 会引发安全异常

Posted

技术标签:

【中文标题】在 SSL 上使用 BinaryJS 会引发安全异常【英文标题】:Using BinaryJS over SSL raises security exceptions 【发布时间】:2020-10-02 16:16:15 【问题描述】:

我的 html 文件通过 HTTPS 提供。当页面连接到常规的(即不安全的)网络套接字时,许多浏览器会抱怨“混合内容”(即安全的 HTTPS 和不安全的 WS)。 Chrome 实际上用很多话告诉我这一点:

binary.min.js:1 Mixed Content: The page at 'https://ppr.cs.dal.ca:3004/client.html' was loaded over HTTPS, 
but attempted to connect to the insecure WebSocket endpoint 'ws://ppr.cs.dal.ca:3003/bs'. 
This request has been blocked; this endpoint must be available over WSS.
    
binary.min.js:1 Uncaught (in promise) DOMException: Failed to construct 'WebSocket': 
An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.

所以,我尝试设置一个安全的 BinaryJS 套接字并连接到它(基于此 GitHub post 和 SO post)。但是,Firefox 和 Chrome 都在抱怨。

我的服务器代码:

const static = require('node-static');
const https = require('https');
const BinaryServer = require('binaryjs').BinaryServer;
const fs = require('fs');

const file = new(static.Server)();
const server = https.createServer(
     key: fs.readFileSync('privkey.pem'), cert: fs.readFileSync('fullchain.pem') , 
    (req, res) =>  file.serve(req, res); 
).listen(3004, '0.0.0.0', () => 
        console.log("listening on :3004");
);

var bs = new BinaryServer(server: server, port: 3003, path: '/bs');
bs.on('connection', (client) => 
        console.log('client connection');
        // ...
)

我的客户代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<script src="jquery-3.4.1.min.js" type="text/javascript"></script>
<script src="binary.min.js" type="text/javascript"></script>
</head>
<body>
<script>
const client = new BinaryClient("wss://ppr.cs.dal.ca:3003/bs");
client.on('open', () => 
        const stream = client.createStream();
        // ...
);
</script>
</body>
</html>

Firefox 给出以下错误:

The connection was refused when attempting to contact wss://ppr.cs.dal.ca:3003/bs.

铬:

binary.min.js:1 WebSocket connection to 'wss://ppr.cs.dal.ca:3003/bs' failed: 
Error in connection establishment: net::ERR_SSL_PROTOCOL_ERROR`

不确定接下来要尝试什么。 BinaryJS 似乎没有得到非常积极的维护。

这个SO post 说我可以使用代理,但我的目标是实时通信,所以这似乎是一个巨大的开销。

也许切换到“常规”网络套接字可能是一种选择? ..

编辑我在使用常规 websockets(即没有 BinaryJS)时遇到了完全相同的问题。那么,这似乎与 WebSockets 的关系比其他任何东西都更重要? ..

【问题讨论】:

【参考方案1】:

对不起大家 - 似乎有一个简单的解决办法。问题是 BinaryServer 端口号;当它与HTTPS服务器相同时,没有问题。事后看来,这很明显(但是,它确实在没有 SSL 的情况下以这种方式工作)..(WebSockets 解决方案在使用相同的端口号时也可以工作)

为了完整起见,我在这里发布一个工作版本:

客户:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<script src="jquery-3.4.1.min.js" type="text/javascript"></script>
<script src="binary.min.js" type="text/javascript"></script>
</head>
<body>
<script>
const client = new BinaryClient("wss://ppr.cs.dal.ca:3004/bs");
client.on('open', () => 
        const stream = client.createStream();
        stream.on('data', e => console.log(JSON.stringify(e)));
        stream.write("hello world");
);
</script>
</body>
</html>

服务器:

const fs = require('fs');
const static = require('node-static');
const https = require('https');
const BinaryServer = require('binaryjs').BinaryServer;
const  Writable = require('stream');

const file = new(static.Server)();
const server = https.createServer(
  cert: fs.readFileSync('fullchain.pem'),
  key: fs.readFileSync('privkey.pem')
, (req, res) => 
        file.serve(req, res);
);

class TestSink extends Writable 
        _write(chunk, encoding, callback) 
                console.log(JSON.stringify(chunk));
        


const bs = new BinaryServer(server: server, path: '/bs');
bs.on('connection', (client) => 
        console.log('connection');
        client.on('stream', (stream, meta) => 
                console.log('stream start');
                const sink = new TestSink();
                stream.pipe(sink);
        );
);

也许它可以帮助某人开始使用基于 SSL 的 BinaryJS。

【讨论】:

以上是关于在 SSL 上使用 BinaryJS 会引发安全异常的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS & SSL - “密码读取错误”

谁知道ssl安全证书哪里下载,怎么获得ssl安全证书?

SSL证书是什么?为什么需要SSL证书?

无法创建 SSL/TLS 安全通道 - 问题可能出在代理服务器上吗?

如何在linux上开设使用ssl安全连接的站点

记录一个ssl证书引发的诡异问题