Socket.IO 无法通过 https 连接
Posted
技术标签:
【中文标题】Socket.IO 无法通过 https 连接【英文标题】:Socket.IO can't connect through 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 上连接给我“连接被中断”。我做错了什么?
【问题讨论】:
【参考方案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以上是关于Socket.IO 无法通过 https 连接的主要内容,如果未能解决你的问题,请参考以下文章