Когда дело доходит до 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), такие как:
- Ошибка подключенияучреждение: net :: ERR_CERT_COMMON_NAME_INVALID
- Ошибка во время рукопожатия WebSocket: отправлено непустой заголовок Sec-WebSocket-Protocol, но ответа не получено
^# 1 - проблема, с которой я сталкиваюсь больше всего
Я использую те же учетные данные ssl, которые предоставляет LetsEncrypt для самого моего сайта - я полагаю, что это нормально?
Итак, большинство из найденных мной руководств либо делают что-то подобное, либо рассказывают о том, как что-то вроде NGINX требуется для настройки прокси / туннелей- что-то, о чем я совершенно не догадывался.
Может кто-нибудь сказать мне, обычно ли для этого требуются конфигурации прокси, или я просто пропускаю что-то маленькое / немое?Любое понимание будет приветствоваться.На случай, если это уместно, я просто режу зубы на AWS с помощью изображения Lightsail PHP от Bitnami.