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

Node.js 在SSL上使用BinaryJS会引发安全异常,node.js,ssl,websocket,Node.js,Ssl,Websocket,我的HTML文件是通过HTTPS提供的。当页面连接到常规(即不安全)web套接字时,许多浏览器会抱怨“混合内容”(即安全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 end

我的HTML文件是通过HTTPS提供的。当页面连接到常规(即不安全)web套接字时,许多浏览器会抱怨“混合内容”(即安全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套接字并连接到它(基于此和)。但是,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>
铬:

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似乎没有得到积极的维护

这意味着我可以使用代理,但我的目标是实时通信,所以这似乎是一个巨大的开销

也许可以选择切换到“常规”WebSocket


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

大家都很抱歉-似乎有一个简单的解决方法。问题是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>
也许它可以帮助人们开始使用基于SSL的BinaryJS

<!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);
        });
});