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