如何在Express应用程序中通过SSL获取websocket



让我的websocket在本地工作后,我部署了它,但由于它没有通过SSL,所以出现了安全错误。我正在托管一个带有Nginx和Certbot的NodeJS Express应用程序。

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,但不是websocket,我如何让套接字也使用SSL/cert?

在这样的设置中,nginx需要处理SSL并正确设置为使用web套接字。以下是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需要信任反向代理。这是他们的一篇文章Express背后的代理。如果您在安全环境中部署,您可以将其设置为app.set('trust proxy', ()=>true)


为了参考,这里是我必须为我的应用程序设置的nginx超时:

proxy_connect_timeout 14d;
proxy_read_timeout 14d;
proxy_send_timeout 14d;

最新更新