После того, как мой веб-сокет работал локально, я развернул его и получил ошибки безопасности из-за того, что он не был через SSL. Я размещаю приложение NodeJS Express с Nginx и Certbot.
server.js
const express = require('express');
const app = express();
// unrelated imports
app.use(bodyParser.json());
app.use(cors());
app.use(express.static('public'));
app.use(bodyParser.json({ limit: '50mb' }))
require('./services/socket')(app)
// unrelated endpoints
app.listen(port);
socket.js
let WebSocket = require('ws');
module.exports = function(app) {
let ws_server = new WebSocket.Server();
ws_server.on('connection', (connection) => {
connection.on('message', (message) => {
ws_server.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN && client != connection) {
client.send(message);
}
});
});
});
}
Теперь приложение использует HTTPS, но не веб-сокет, как я могу заставить сокет также использовать SSL / сертификаты?
@Teivaz Не могли бы вы подробнее рассказать об этом? Это то, что я сейчас делаю, но мой сокет не принимает wss://.





В такой настройке nginx должен обрабатывать SSL и быть правильно настроен для работы с веб-сокетами. Вот статья из блога nginx NGINX как прокси-сервер WebSocket. Важнейшие биты:
location /wsapp/ {
proxy_pass http://wsbackend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
}
Вы также можете настроить тайм-ауты для подключения.
И Express должен доверять обратному прокси. Вот статья от них Экспресс через прокси
. Если вы развертываете в безопасной среде, вы можете просто установить его на app.set('trust proxy', ()=>true).
Для справки, вот таймауты nginx, которые мне пришлось настроить для своего приложения:
proxy_connect_timeout 14d;
proxy_read_timeout 14d;
proxy_send_timeout 14d;
Если вы используете nginx, вы можете делать там все ssl и использовать простой http на стороне узла.