无法使socket.io在HTTPS上工作

我正在使用简单的socket.io 2.0.3服务器没有快递或任何类似的在我的Laravel应用程序中运行简单的聊天function。

一切都很好,直到我决定将网站切换到HTTPS。 现在socket.io拒绝连接(ERR_CONNECTION_CLOSED)。

这是我最简单的设置:

server.js:

var io = require('socket.io')(8080, { origins : //some stuff }); 

HTML文件

 <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script> var socket = io(':8080'); //more stuff 

我在服务器文件夹,intermediate.crt,domain.com.crt和domain.com.key都需要证书文件

有人可以帮助最简单的例子如何使这项工作在https上? 提前致谢!

编辑:需要可能的解决scheme,不使用Express。

您可以使用所有相关设置创buildHTTPS服务器的实例

 var https = require('https'); https.createServer(options, app).listen(443); 

然后简单地把它传递给构造函数:

 new SocketIo(https) 

重要事实 :

您必须使用https不是http,需要加载crt文件并创build选项对象,如示例客户端只需要正确的地址,如: https : //YOUR_domain.com : PORT

服务器端 :

 //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ //High definition //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // Globals //var MEMORY_CLEANER_INTERVAL = 5000; //var crypto = require('crypto'); var tls = require('tls'); //dl = require('delivery'); var fs = require("fs"); var mysql = require('mysql'); var express = require("express"); var app = express(); var http = require('http'); var https = require('https'); //var mkdirp = require('mkdirp'); var path = require('path'); //var nodemailer = require('nodemailer'); //includer function read(f) {return fs.readFileSync(f).toString();} function include(f) {eval.apply(global, [read(f)]);} //var BASE = require('./lib/level1_module'); //BASE.NAME = "YEap"; var pkey = fs.readFileSync('/etc/httpd/ssl/YOUR_FILE.key'); var pcert = fs.readFileSync('/etc/httpd/ssl/YOUR_FILE_com.crt') var SERVER_PORT = 9000; var options = { hostname: 'YOUR_PAGE.com', port: 9000, key: pkey, cert: pcert, requestCert: true, rejectUnauthorized: false, }; var server = https.createServer(options, app).listen(SERVER_PORT, function(){ console.log("Express server listening on port " + SERVER_PORT); }); var io = require('socket.io').listen(server); server.listen(SERVER_PORT); console.log('Socket server listening on port : ' , SERVER_PORT); 

我无法用简单的socket.io编写这个代码,所以最后我使用了express。

如果将来有人需要,以下是最简单的工作代码:

server.js

 var express = require('express'); var app = module.exports = express(); var https = require('https'); var fs = require('fs'); var server = https.createServer({ key: fs.readFileSync(/*full path to your key*/), cert: fs.readFileSync(/*full path to your cert*/), ca: fs.readFileSync(/*full path to your intermediate cert*/), requestCert: true, rejectUnauthorized: false },app); server.listen(8080); //listen on port 8080 var io = require('socket.io').listen(server); io.set('origins', /*your desired origins*/); io.set('transports', ['websocket', 'flashsocket', 'htmlfile', 'xhr-polling', 'jsonp-polling', 'polling']); var sockets = {}; //your socket logic 

在HTML中:

 var socket = io(':8080',{secure: true});