在 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 会引发安全异常的主要内容,如果未能解决你的问题,请参考以下文章