简体   繁体   English

无法使socket.io在HTTPS上运行

[英]Can't make socket.io work on HTTPS

I'm using simple socket.io 2.0.3 server without express or anything similar to run simple chat feature in my Laravel app. 我正在使用简单的socket.io 2.0.3服务器,没有快速或类似的东西,在我的Laravel应用程序中运行简单的聊天功能。

Everything was working well until I decided to switch website to HTTPS. 一切顺利,直到我决定将网站切换到HTTPS。 Now socket.io refuses to connect (ERR_CONNECTION_CLOSED). 现在socket.io拒绝连接(ERR_CONNECTION_CLOSED)。

Here is my simplest setup: 这是我最简单的设置:

server.js: server.js:

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

HTML file HTML文件

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>

var socket = io(':8080');
//more stuff

I have all needed certificate files in server folder, intermediate.crt, domain.com.crt and domain.com.key 我在服务器文件夹,intermediate.crt,domain.com.crt和domain.com.key中都需要证书文件

Can someone help with simplest example how to make this work on https? 有人可以帮助最简单的例子如何在https上使这个工作? Thanks in advance! 提前致谢!

Edit: Need possible solution without using Express. 编辑:需要可能的解决方案而不使用Express。

I couldn't manage to write this in simple socket.io code, so I ended up using express after all. 我无法用简单的socket.io代码编写这个,所以我最终使用了express。

Here is the simplest working code if anyone needs it in future: 如果以后有人需要,这是最简单的工作代码:

server.js 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

in HTML: 在HTML中:

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

You can create an instance of an HTTPS server with all your relevant settings 您可以使用所有相关设置创建HTTPS服务器的实例

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

Then simply pass it to the constructor: 然后只需将其传递给构造函数:

new SocketIo(https)

Important facts : 重要事实 :

You must use https not http , Need to load crt files and create options object like in example Client side need only correct address like : https://YOUR_domain.com:PORT 您必须使用https而不是http,需要加载crt文件并创建选项对象,例如客户端只需要正确的地址,如: https//YOUR_domain.comPORT

Server side : 服务器端 :

//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
//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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM