无法连接到本地Node.js安全的WebSocketServer

时间:2019-01-11 17:51:19

标签: javascript node.js ssl networking websocket

为了测试JavaScript / html5应用程序,我使用node.js和ws package创建了一个本地WebSocketServer。我想使用带有SSL / TLS的安全网络套接字(wss)。

密钥和证书是由OpenSSL在本地创建的(自签名证书)。

客户端仅尝试使用本机WebSocket对象连接到(本地)https服务器:

var ws = new Websocket('wss://localhost:8080');

问题是,浏览器(Firefox,Chrome,Edge)可以连接到服务器,并且它们都给我不同的错误消息。

Firefox:

  

Firefox无法通过wss连接到服务器://本地主机:8080/。

Chrome浏览器:

  

ws_client.js:7与'wss:// localhost:8080 /'的WebSocket连接失败:   建立连接错误:net :: ERR_CERT_AUTHORITY_INVALID

边缘:

  

SCRIPT12017:SCRIPT12017:WebSocket错误:SECURITY_ERR,跨区域   不允许连接

我在OpenSSL(最新版本,最新版)中创建了证书和密钥:

openssl req -new -x509 -nodes -out server.crt -keyout server.key

(source)

我检查了有关此(和类似)主题的几乎所有问题,例如this question,但没有一个可以提供解决方案。

请不要将此问题标记为重复问题,因为所有相似的问题都包含略有不同的问题!

服务器代码:

var fs = require('file-system');

var pkey = fs.readFileSync('server.key', 'utf8');
var crt = fs.readFileSync('server.crt', 'utf8');

var credentials = { key: pkey, cert: crt };
var https = require('https');

var httpsServer = https.createServer(credentials);
httpsServer.listen(8080);

var WebSocketServer = require('ws').Server;

var wss = new WebSocketServer({
    server: httpsServer
});

wss.on('connection', function connection(ws) {
    ws.on('message', function incoming(message) {
        console.log('received: %s', message);
        ws.send('reply from server : ' + message)
    });

});

我尝试使用其他代码作为服务器,但是发生相同的错误:

const WebSocketServer = require('ws').Server; 
var fs = require('file-system');

var ws_cfg = {
    ssl: true,
    port: 8080,
    ssl_key: 'server.key',
    ssl_cert: 'server.crt'
};

var processRequest = function(req, res) {
    console.log('Request received');
};

var httpServ = require('https');

var app = httpServ.createServer({
    key: fs.readFileSync(ws_cfg.ssl_key, 'utf8', (error) => {
        console.log('Error reading file');
    }),
    cert: fs.readFileSync(ws_cfg.ssl_cert, 'utf8',  (error) => {
        console.log('Error reading file');
    })
}, processRequest).listen(ws_cfg.port, function(){
    console.log('Server running');
});



var wss = new WebSocketServer( {server: app, port: 8080, host: 'localhost', domain: 'localhost'} );



wss.on('connection', function (ws) {

    console.log('Connected to a client');

    ws.on('message', function (message) {

        console.log('MSG received: ' + message);

    });

});

还有一件事。总是,如果我在服务器代码中添加console.log(wss);,则输出看起来像这样:

WebSocketServer {
  domain: null,
  ...some more stuff...
  ...cert key etc....
  host: null,
  path: null,
  port: null } }

主机,域和端口设置为null。我尝试了所有将其设置为localhost:8080的方法,但没有任何结果。我认为这可能是所有问题的根源,但找不到办法。如果有人知道这个问题的答案,我将不胜感激。

(使用不安全的'ws'协议('ws:// localhost:8080')以便连接到本地node.js http服务器,但我想尽可能实际地测试该应用程序,使用安全的连接。)

2 个答案:

答案 0 :(得分:0)

我想这个问题已经解决了。好吧,不是真的,但是对于本地测试应该没问题。

对于有相同问题的任何人,这是我所做的:

服务器代码应为:

const fs = require('fs');  //or 'file-System' , 'fs'-module is officially deprecated
const https = require('https');
const WebSocket = require('ws');

const server = new https.createServer({
  cert: fs.readFileSync(localcert.cert'),   //what ever you're files are called
  key: fs.readFileSync('localkey.key')
});

const wss = new WebSocket.Server({ server });  // !

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {
    console.log('MSG received: %s', message);
  });

  ws.send('Hi to client');
});


server.listen(8080);

目前仅可在Google Chrome浏览器中使用,仍无法在Firefox中连接。

在Google Chrome浏览器中输入chrome://flags/#allow-insecure-localhost并启用。

答案 1 :(得分:0)

尝试添加自签名证书或生成CA您正在使用的系统上是可信的。