Node.js,socket.io的HTTPS连接

4

服务器端代码:

var io = require('socket.io').listen(8150);
io.sockets.on('connection', function (socket){

});

客户端代码:

var socketIO = io('*.*.*.*:8150');
socketIO.once('connect', function(){

});

在http上它能够工作,但在同一页面的https上它无法连接。搜索了许多示例,但所有示例都是针对express的。我没有在node.js中创建任何http服务器,只需要socket.io工作。


当您将HTML页面更改为https时,是否更改了上面的任何代码? - Loren
不,我没有改变任何代码。这是原始代码在HTTP上运行,但在HTTPS上无法运行。 - PainMustDie
2个回答

7
当使用HTTPS运行客户端时,socket.io也会尝试通过HTTPS连接到您的服务器。目前,您的服务器仅接受HTTP连接,listen(port)函数不支持HTTPS。
您需要创建一个HTTPS服务器,然后将socket.io附加到它上面,就像这样。
var fs = require('fs');

var options = {
  key: fs.readFileSync('certs/privkey.pem'),
  cert: fs.readFileSync('certs/fullchain.pem')
};

var app = require('https').createServer(options);
var io = require('socket.io').listen(app);
app.listen(8150);

io.sockets.on('connection', function (socket) {

});

如果你需要同时支持HTTP和HTTPS,你可以启动两个服务器并将socket.io连接到这两个服务器。

var fs = require('fs');

var options = {
  key: fs.readFileSync('certs/privkey.pem'),
  cert: fs.readFileSync('certs/fullchain.pem')
};

var httpServer = require('http').createServer();
var httpsServer = require('https').createServer(options);
var ioServer = require('socket.io');

var io = new ioServer();
io.attach(httpServer);
io.attach(httpsServer);
httpServer.listen(8150);
httpsServer.listen(8151);

io.sockets.on('connection', function (socket) {

});

在客户端,您可以根据页面是通过HTTP还是HTTPS访问来确定连接哪个端口。

var port = location.protocol === 'https:' ? 8151 : 8150;
var socketIO = io('*.*.*.*:' + port);
socketIO.once('connect', function() {

});

我有三个文件。 server.key - (服务器私钥) // server.crt - (我的服务器证书) // chsert.crt - (链接其他证书)。我该如何生成privkey.pem和fullchain.pem。 我试着将文件重命名为.pem,但是出现了错误Error: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch - PainMustDie
我如何创建fullchain.pem? - PainMustDie
这些文件应该原封不动地工作。将key:设置为您的server.key文件,将cert:设置为您的server.crt文件,并添加一个名为ca:的属性,其中包含您的chsert.crt文件数组。查看答案以获取示例。 - Eric B

0

使用Plesk和letsencrypt获取有效的SSL证书。

options = {
    key: fs.readFileSync('/usr/local/psa/var/modules/letsencrypt/etc/live/mydomain.com/privkey.pem'),
    cert: fs.readFileSync('/usr/local/psa/var/modules/letsencrypt/etc/live/mydomain.com/cert.pem'),
    ca: fs.readFileSync('/usr/local/psa/var/modules/letsencrypt/etc/live/mydomain.com/chain.pem'),
    rejectUnauthorized: false,
    requestCert: true,
    agent: false
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接