Socket.io 不适用于 https(让我们加密)

Posted

技术标签:

【中文标题】Socket.io 不适用于 https(让我们加密)【英文标题】:Socket.io not working with https (Let's Encrypt) 【发布时间】:2018-10-20 20:38:48 【问题描述】:

我正在使用 ASP.NET CORE 2.0 构建电子商务。电子商务有一个使用 nodejs 和包 socket.io 构建的聊天。 socket.io 服务器 在服务器上是远程。当我在本地使用 Socket.io 客户端,运行 Visual Studio 调试器,访问远程 socket.io 时,一切正常。

代码是这样的,注意我没有使用https

var app2 = require('express')();
var http = require('http').Server(app);
var http2 = require('http').Server(app2);
var io = require('socket.io')(http);


http.listen(3009, function () 
    console.log('listening on port 3009');
);

http2.listen(3011, function () 
    console.log('listening on port 3011');
);

但是当我发布我的网站并获取 html 页面以及由 nginx/kestrel 提供的 socket.io 客户端时,我收到一条错误消息,说我正在混合一些东西,我没有注意错误消息,因为我记得我在服务器 socket.io 和客户端上使用了 http。所以我更改了 socket.io 服务器和客户端,但现在我无法连接。

我的修改是这样的:

var app2 = require('express')();
var http = require('https').Server(app);
var http2 = require('https').Server(app2);
var io = require('socket.io')(http);


http.listen(3009, function () 
    console.log('listening on port 3009');
);

http2.listen(3011, function () 
    console.log('listening on port 3011');
);

客户

  myIo = io('https://www.example.com.br:3009',  secure: true, reconnect: true, rejectUnauthorized: false );

我使用 Let's encrypt 来启用 https 连接,我使用 Nginx 作为 Kestrel 的代理,我在 Ubuntu 17 上使用 ufw。

【问题讨论】:

【参考方案1】:

我昨天收到了这个错误。我什至晚上都睡不着。但我得到了它的工作。我是这样发送证书的。

var app = require('express')();

var app2 = require('express')();
var fs = require('fs');


var options = 
    key: fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem'),
    cert: fs.readFileSync('/etc/letsencrypt/live/example.com/cert.pem'),
    ca: fs.readFileSync('/etc/letsencrypt/live/example.com/chain.pem')
;

var http = require('https').Server(options, app);


var http2 = require('https').Server(app2);
var io = require('socket.io')(http);

app.get('/', function (req, res) 
    res.send('server is running');
);

app2.get('/', function (req, res) 
    res.send('admin area');
);

我不想让任何人感受到挫败感。希望我能帮助别人。

【讨论】:

【参考方案2】:

您需要为您的客户端和服务器添加传输类型

服务器

var io = require('socket.io')(http); io.set('transports', ['websocket']);

客户

myIo = io('https://www.example.com.br:3009', transports: ['websocket'], upgrade: false , 'force new connection': true );

【讨论】:

以上是关于Socket.io 不适用于 https(让我们加密)的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 不适用于传输:['xhr-polling']

Socket.io 不适用于 nginx

CORS 不适用于 hapijs 和 socket.io

Socket.io + NodeJS 不适用于 Heroku

socket.io 广播不适用于 React

socket.io 连接不适用于 react.js