【问题标题】:Socket.IO can't connect through httpsSocket.IO 无法通过 https 连接
【发布时间】:2013-03-05 03:51:41
【问题描述】:

我有一个使用 socket.IO 的 node.js 应用程序。它在 http 上运行良好,但是当尝试通过 https 连接到套接字时 - 没有任何反应。
以下是部分代码:

var fs = require('fs');  

var ioHttp = require('socket.io').listen(8899, {  
    'flash policy port': -1  
});  

initSocket(ioHttp);  

var ioHttps = require('socket.io').listen(8895, {  
    key: fs.readFileSync('/path/to/file/file.key'),  
    cert: fs.readFileSync('/path/to/file/file.crt'),  
    ca: [  
        fs.readFileSync('/path/to/file/sub.class1.server.ca.pem'),  
        fs.readFileSync('/path/to/file/ca.pem')  
    ],  
    'flash policy port': -1   
});  

initSocket(ioHttps);  

和initSocket 函数:

function initSocket(io) {  
    io.enable('browser client minification');  
    io.enable('browser client etag');  
    io.enable('browser client gzip');  

    io.set('transports', [  
        'websocket',  
        'htmlfile',
        'flashsocket',
        'jsonp-polling'  
    ]);  

    io.sockets.on('connection', function (client) {
        //the connnection is handled here
    });
}

客户端连接如下:

var secureConnection = false;  
var port = 8899;
if (window.location.protocol === 'https:') {  
    port = 8895;
    secureConnection = true;
}

var socket = io.connect('domain.org', {port: port, secure: secureConnection});

正如我所说,在 http 上一切正常,但在 https 上连接给我“连接被中断”。我做错了什么?

【问题讨论】:

    标签: javascript node.js https websocket socket.io


    【解决方案1】:

    您不能像https 服务器一样初始化socket.io 服务器。您必须启动一个单独的 https 服务器,然后将 socket.io 服务器附加到它。

    var https = require('https'),     
        fs =    require('fs');        
    
    var options = {
        key:    fs.readFileSync('ssl/server.key'),
        cert:   fs.readFileSync('ssl/server.crt'),
        ca:     fs.readFileSync('ssl/ca.crt')
    };
    var app = https.createServer(options);
    io = require('socket.io').listen(app);     //socket.io server listens to https connections
    app.listen(8895, "0.0.0.0");
    

    【讨论】:

    • 您可以自行签名吗?socket.io 在浏览器中会像普通 HTTP 一样检查证书并发出警告吗?
    • 你好,server.key、server.crt 和 ca.crt 从哪里得到?是自制的吗?如果是自制的,它可以用于生产吗?
    • @GreenGiant 在documentation 中查找 requestCert 和 rejectUnauthorized 内部选项
    • @AdrianSalazar 是的,我使用的是自制文件,带有 openssl 命令行工具。对于生产,它将无法工作,因为证书需要由证书验证。权威——信任网。幸运的是,现在有一种方法可以做到这一点。 EFF 最近宣布了Let's Encrypt,它可以帮助开发人员轻松免费地获取和维护证书。使用他们的图书馆node-acme。我不能给出详细的说明,因为这是我知识的极限,也许其他人可以。
    • @DarkNeuron 是的,这是link to the Let’s Encrypt website
    猜你喜欢
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多