как установить безопасное соединение клиент / сервер через websocket в nodejs / javascript?

#javascript #node.js #http #ssl #websocket

#javascript #node.js #http #ssl #websocket

Вопрос:

Вы, вероятно, думаете, что этот вопрос можно пометить как дубликат, но я искал везде и не нашел того, что ищу.

Я разрабатываю приложение ionic-react и использую сервер nodejs в качестве серверной части. Я подключаю своего клиента к серверу через websocket. Я использую библиотеку SocketIO-client на стороне клиента и встроенный модуль https и express framework на стороне сервера.

Все работает нормально, когда я использую соединение http или ws. Теперь мое приложение готово к производству, и я переключаюсь на https или wss в моем случае, потому что я хочу использовать websocket. Я делаю это впервые, поэтому это меня очень смущает.

Вот мой клиентский код (я изменил secure на true, поскольку прочитал, что я должен это сделать, если я планирую использовать https / ssl):

 import socketIOClient from 'socket.io-client';

const socket = socketIOClient("wss://localhost:8000", { secure: true });
  

Вот мой серверный код:

 var express = require('express');
var https = require('https');
var http = require('http');
var fs = require('fs');
var ws = require('ws').Server;
// This line is from the Node.js HTTPS documentation.
var options = {
  key: fs.readFileSync('key.pem').toString(),
  cert: fs.readFileSync('cert.pem').toString(),

};

var app = express();
var httpsServer = https.createServer(options, app);

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


wss.on("connection", (socket) => {
    console.log("client connected");

    socket.on("message", (msg) => {
        console.log("received: ", msg);
    });

    socket.on("disconnection", () => {
        console.log("client disconnected");
    })
});
httpsServer.listen(8000, () => {
    console.log("server running on 8000");
})
  

Я сгенерировал ssl-сертификат, следуя этому примеру.
Мой код отлично работает, когда я использую http, но внезапно я получаю сообщение об ошибке при использовании https / wss, хотя я добавил SSL-сертификат.

Интересно, что ошибка, которую я получаю в chrome, отличается от ошибки в Firefox. Вот ошибка, которую я получаю в chrome (она даже выглядит как две независимые ошибки):

     Access to XMLHttpRequest at 'https://localhost:8000/socket.io/?EIO=3amp;transport=pollingamp;t=NFuRgsF' from origin 'http://localhost:8100' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
    polling-xhr.js:268 

GET https://localhost:8000/socket.io/?EIO=3amp;transport=pollingamp;t=NFuRgsF net::ERR_FAILED 
  

Вот ошибка, которую я получаю в Firefox:

 Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://localhost:8000/socket.io/?EIO=3amp;transport=pollingamp;t=NFuR-Im. (Reason: CORS request did not succeed).
  

Я пытался отключить все мои плагины borwser (например, adblock), но это не сработало. Далее я попытался настроить заголовок и cors (я нашел это в Интернете, читая об ошибке cors):

 app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    //res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    
    next();
  });
  

Однако добавление этого кода ничего не изменило, и ошибка по-прежнему появляется. Я не знаю, что мне с этим делать. Возможно, это глупый вопрос, но нужно ли мне каким-то образом предоставлять сертификат также на стороне клиента? это проблема на стороне клиента или сервера?

Комментарии:

1. Доверяли ли вы также сгенерированному вами самозаверяющему сертификату?

2. @AntoineRaoulIscaros Я так не думаю. Извините, я действительно новичок в этом. Я даже не знаю, как этому доверять или что это означает в контексте

3. @AntoineRaoulIscaros Итак, я прочитал о доверии в Интернете. Оказывается, мне это нужно только в рабочей среде, но в моем случае здесь я пробую это на localhost, и это даже не работает. правильно?

4. Это зависит от того, как вы подписали сертификат.

5. Работает ли у вас веб-сайт https?