Не удается подключиться к локальному безопасному WebSocketServer Node.js. - PullRequest
0 голосов
/ 11 января 2019

Для тестирования приложения JavaScript / html5 я создал локальный WebSocketServer с node.js и ws package . Я хочу использовать безопасные веб-сокеты (wss) с SSL / TLS.

Ключ и сертификат были созданы для тестирования локально OpenSSL (самозаверяющий сертификат).

Клиент просто пытается использовать собственный объект WebSocket для подключения к (локальному) серверу https:

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

Проблема в том, что нет браузер (Firefox, Chrome, Edge) может подключиться к серверу, и все они дают мне различные сообщения об ошибках.

Firefox:

Firefox не может подключиться к серверу по адресу wss: // localhost: 8080 /.

Хром:

ws_client.js: 7 Ошибка подключения WebSocket к 'wss: // localhost: 8080 /': Ошибка при установлении соединения: net :: ERR_CERT_AUTHORITY_INVALID

Край:

SCRIPT12017: SCRIPT12017: Ошибка WebSocket: SECURITY_ERR, кросс-зона соединение не разрешено

Я создал сертификат и ключ в OpenSSL (облегченная, новейшая версия) следующим образом:

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

(источник)

Я проверил почти все вопросы по этой (и аналогичным) темам, например, этот вопрос , но ни один из них не мог дать решения.

Пожалуйста, не отмечайте этот вопрос как дубликат, потому что все похожие вопросы содержат слегка отличающиеся проблемы!

Код сервера:

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') для подключения к локальному http-серверу node.js работает, но я хочу протестировать приложение как можно более реалистичным и используйте безопасное соединение.)

1 Ответ

0 голосов
/ 12 января 2019

Проблема вроде как решена, наверное. Ну, не совсем, но для локального тестирования это должно быть хорошо.

Для тех, у кого такие же проблемы, вот что я сделал:

Сервер Код должен быть:

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.

введите chrome://flags/#allow-insecure-localhost в Google Chrome и включите.

...