【问题标题】:Using BinaryJS over SSL raises security exceptions在 SSL 上使用 BinaryJS 会引发安全异常
【发布时间】: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 postSO 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 的关系比其他任何东西都更重要? ..

【问题讨论】:

    标签: node.js ssl websocket


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2012-01-30
      • 2011-05-08
      • 2012-11-22
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多