Каковы минимальные требования для безопасной работы WebSocket с Node.js? - PullRequest
0 голосов
/ 20 сентября 2019

Когда дело доходит до WebSockets, кажется, что в Интернете есть множество учебных пособий по ws: // (небезопасно), но вряд ли по wss: // (защищено).У меня небезопасное соединение с веб-сокетом, которое отлично работает с Node.js благодаря учебному пособию по Supun Kavinda , но я не могу заставить его работать как безопасное соединение.

Вот обобщенный рабочий коддля небезопасного соединения (поддельный IP-адрес):

Файл: js-index.js

window.WebSocket = window.WebSocket || window.MozWebSocket;
var connection = new WebSocket('ws://3.00.00.00:8080');

Файл: сервер.js

const https = require('https');
const fs = require('fs');
var WebsocketServer = require('websocket').server;

var server = https.createServer(function(request,response) {
  function getPostParams(request, callback) {
    var qs = require('querystring');
    if (request.method == 'POST') {
      var body = '';
      request.on('data', function (data) {
        body += data;
        // Too much POST data, kill the connection!
        if (body.length > 1e6)
          request.connection.destroy();
      });
      request.on('end', function () {
        var POST = qs.parse(body);
        callback(POST);
      });
    }
  }

  if (request.method === "POST") {
    getPostParams(request, function(POST) {
        messageClients(POST.data);
        response.writeHead(200);
        response.end();
    });
    return;
  }
});
server.listen(8080);

/*Handling websocket requests*/
var websocketServer = new WebsocketServer({
    httpServer: server
});
websocketServer.on("request", websocketRequest);
global.clients = {}; // connected clients
var connectionId = 0;
function websocketRequest(request) {
  var connection = request.accept(null, request.origin);
  connectionId++;
  clients[connectionId] = connection;
}
function messageClients(message) {
  for (var i in clients) {
    clients[i].sendUTF(message);
  }
}

Для безопасного соединения я пробовал много вещей, в основном связанных с заменой ws: // на wss: // и включением сертификата / ключа .pem в createServer() вызов, например, так:

const ssl_creds = {
 cert: fs.readFileSync('/opt/bitnami/apache2/htdocs/fullchain.pem'),
 key: fs.readFileSync('/opt/bitnami/apache2/htdocs/privkey.pem')
};
var server = https.createServer(ssl_creds, function(request,response) {....

Однако, я продолжаю получать ошибки (пока только тестирование в Chrome), такие как:

  1. Ошибка подключенияучреждение: net :: ERR_CERT_COMMON_NAME_INVALID
  2. Ошибка во время рукопожатия WebSocket: отправлено непустой заголовок Sec-WebSocket-Protocol, но ответа не получено

^# 1 - проблема, с которой я сталкиваюсь больше всего

Я использую те же учетные данные ssl, которые предоставляет LetsEncrypt для самого моего сайта - я полагаю, что это нормально?

Итак, большинство из найденных мной руководств либо делают что-то подобное, либо рассказывают о том, как что-то вроде NGINX требуется для настройки прокси / туннелей- что-то, о чем я совершенно не догадывался.

Может кто-нибудь сказать мне, обычно ли для этого требуются конфигурации прокси, или я просто пропускаю что-то маленькое / немое?Любое понимание будет приветствоваться.На случай, если это уместно, я просто режу зубы на AWS с помощью изображения Lightsail PHP от Bitnami.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...