首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >node.js、使用SSL的socket.io

node.js、使用SSL的socket.io
EN

Stack Overflow用户
提问于 2011-07-07 00:00:30
回答 9查看 215K关注 0票数 180

我正在尝试使用我的SSL证书运行socket.io,但是它无法连接。

我的代码基于聊天示例:

代码语言:javascript
复制
var https = require('https');
var fs = require('fs');
/**
 * Bootstrap app.
 */
var sys = require('sys')
require.paths.unshift(__dirname + '/../../lib/');

/**
* Module dependencies.
*/

var express = require('express')
  , stylus = require('stylus')
  , nib = require('nib')
  , sio = require('socket.io');

/**
 * App.
 */
var privateKey = fs.readFileSync('../key').toString();
var certificate = fs.readFileSync('../crt').toString();
var ca = fs.readFileSync('../intermediate.crt').toString();

var app = express.createServer({key:privateKey,cert:certificate,ca:ca });


/**
 * App configuration.
 */

...

/**
 * App routes.
 */

app.get('/', function (req, res) {
  res.render('index', { layout: false });
});

/**
 * App listen.
 */

app.listen(443, function () {
  var addr = app.address();
  console.log('   app listening on http://' + addr.address + ':' + addr.port);
});

/**
 * Socket.IO server (single process only)
 */

var io = sio.listen(app,{key:privateKey,cert:certificate,ca:ca});
...

如果我删除SSL代码,它可以正常运行,但是,我收到了一个对http://domain.com/socket.io/1/?t=1309967919512的请求。

注意,它不是在尝试https,这会导致它失败。

我在chrome上测试,因为它是这个应用程序的目标浏览器。

如果这是一个简单的问题,我很抱歉,我是一个node/socket.io新手。

谢谢!

EN

回答 9

Stack Overflow用户

发布于 2014-03-10 02:36:58

同样,如果您的服务器同时支持httphttps,则可以使用以下命令进行连接:

代码语言:javascript
复制
var socket = io.connect('//localhost');

auto detect the browser scheme并相应地使用http/https进行连接。在https中时,传输将在默认情况下受到保护,因为使用

代码语言:javascript
复制
var socket = io.connect('https://localhost');

将使用安全的web套接字- wss:// ( {secure: true}是冗余的)。

有关如何使用相同的节点服务器轻松提供http和https的更多信息,请查看this answer

票数 35
EN

Stack Overflow用户

发布于 2019-08-07 22:12:18

根据您的需要,您可以同时允许安全连接和不安全连接,但仍然只使用一个Socket.io实例。

您只需实例化两个服务器,一个用于HTTP,另一个用于HTTPS,然后将这些服务器附加到Socket.io实例。

服务器端:

代码语言:javascript
复制
// needed to read certificates from disk
const fs          = require( "fs"    );

// Servers with and without SSL
const http        = require( "http"  )
const https       = require( "https" );
const httpPort    = 3333;
const httpsPort   = 3334;
const httpServer  = http.createServer();
const httpsServer = https.createServer({
    "key" : fs.readFileSync( "yourcert.key" ),
    "cert": fs.readFileSync( "yourcert.crt" ),
    "ca"  : fs.readFileSync( "yourca.crt"   )
});
httpServer.listen( httpPort, function() {
    console.log(  `Listening HTTP on ${httpPort}` );
});
httpsServer.listen( httpsPort, function() {
    console.log(  `Listening HTTPS on ${httpsPort}` );
});

// Socket.io
const ioServer = require( "socket.io" );
const io       = new ioServer();
io.attach( httpServer  );
io.attach( httpsServer );

io.on( "connection", function( socket ) {

    console.log( "user connected" );
    // ... your code

});

客户端:

代码语言:javascript
复制
var url    = "//example.com:" + ( window.location.protocol == "https:" ? "3334" : "3333" );
var socket = io( url, {
    // set to false only if you use self-signed certificate !
    "rejectUnauthorized": true
});
socket.on( "connect", function( e ) {
    console.log( "connect", e );
});

如果您的NodeJS服务器与您的Web服务器不同,您可能需要设置一些CORS标头。因此,在服务器端,替换:

代码语言:javascript
复制
const httpServer  = http.createServer();
const httpsServer = https.createServer({
    "key" : fs.readFileSync( "yourcert.key" ),
    "cert": fs.readFileSync( "yourcert.crt" ),
    "ca"  : fs.readFileSync( "yourca.crt"   )
});

通过以下方式:

代码语言:javascript
复制
const CORS_fn = (req, res) => {
    res.setHeader( "Access-Control-Allow-Origin"     , "*"    );
    res.setHeader( "Access-Control-Allow-Credentials", "true" );
    res.setHeader( "Access-Control-Allow-Methods"    , "*"    );
    res.setHeader( "Access-Control-Allow-Headers"    , "*"    );
    if ( req.method === "OPTIONS" ) {
        res.writeHead(200);
        res.end();
        return;
    }
};
const httpServer  = http.createServer( CORS_fn );
const httpsServer = https.createServer({
        "key" : fs.readFileSync( "yourcert.key" ),
        "cert": fs.readFileSync( "yourcert.crt" ),
        "ca"  : fs.readFileSync( "yourca.crt"   )
}, CORS_fn );

当然,还可以根据需要添加/删除标头并设置标头的值。

票数 6
EN

Stack Overflow用户

发布于 2016-10-25 21:00:20

检查this.configuration..

代码语言:javascript
复制
app = module.exports = express();
var httpsOptions = { key: fs.readFileSync('certificates/server.key'), cert: fs.readFileSync('certificates/final.crt') };        
var secureServer = require('https').createServer(httpsOptions, app);
io = module.exports = require('socket.io').listen(secureServer,{pingTimeout: 7000, pingInterval: 10000});
io.set("transports", ["xhr-polling","websocket","polling", "htmlfile"]);
secureServer.listen(3000);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6599470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档