【问题标题】:How to make 2 nodejs servers connect with SSL websocket?如何使 2 个 nodejs 服务器与 SSL websocket 连接?
【发布时间】:2018-01-30 00:29:59
【问题描述】:

我正在尝试让 2 个服务器通过 socket.io 库和 SSL 进行通信。

这在升级socket.io 软件包之前一直有效(不能告诉你是哪个)。

我已设法修复与浏览器的安全连接。我还让它在不安全的(http)服务器之间工作。但是安全(https)服务器拒绝在它们之间进行连接。您可能会争辩说socket.io 不是为服务器到服务器通信而设计的,但它可以为我节省大量的修复工作。

我现在正在跑步:

node: 7.5.0
express: 4.16.2
socket.io (and socket.io-client): 2.0.3

我什至无法在下面制作简单的示例(删除我所有的中间件)。

节点服务器

// Use SSL certificate
const cert_path = "..";
const fs = require('fs');
const https_options = {
    key:  fs.readFileSync(cert_path+'/privkey.pem'),
    cert: fs.readFileSync(cert_path+'/cert.pem')
};

const app = require('express')();

const https = require('https');
const server = https.createServer(https_options, app);

const io = require('socket.io')(server);

server.listen(8000);

io.on('connection', function (socket) {
    console.log("connected");
});

节点客户端

const io = require('socket.io-client');

const socket = io.connect(
    'https://localhost:8000',
    {secure: true}
);

socket.on("connect", function () {
    console.log("connected");
});

什么都没有发生,它们都没有连接。知道为什么吗?


编辑:connect_errorreconnect_error 在客户端每 5 秒弹出一次:

{ Error: xhr poll error
    at XHR.Transport.onError (../node_modules/engine.io-client/lib/transport.js:64:13)
    at Request.<anonymous> (../node_modules/engine.io-client/lib/transports/polling-xhr.js:128:10)
    at Request.Emitter.emit (../node_modules/component-emitter/index.js:133:20)
    at Request.onError (../node_modules/engine.io-client/lib/transports/polling-xhr.js:310:8)
    at Timeout._onTimeout (../node_modules/engine.io-client/lib/transports/polling-xhr.js:257:18)
    at ontimeout (timers.js:365:14)
    at tryOnTimeout (timers.js:237:5)
    at Timer.listOnTimeout (timers.js:207:5) type: 'TransportError', description: 503 }

进一步挖掘错误,我发现它可能来自证书。但是,当我应用 SO 的几种解决方法时,我连续得到 ECONNREFUSED、UNABLE_TO_VERIFY_LEAF_SIGNATURE,最后是 DEPTH_ZERO_SELF_SIGNED_CERT...

【问题讨论】:

  • 您是否确认同步加载凭据所用的时间不超过加载服务器所需的时间?如果这是一个问题,那么您可以考虑使用fs.readFile(异步版本)或只使用dotenv 的环境变量,并完全避免同步或异步操作。
  • 阅读正常,不是问题。它在向网页提供 wss 时有效。
  • 您是否尝试过在客户端的错误事件中添加监听器?我没有使用 socket.io 的经验,但快速查看 API 文档,我发现:socket.io/docs/client-api/#event-connect_error.
  • 好主意:我收到了 reconnect_error。我用这个编辑。
  • 你有socket.iosocket.io-client的匹配版本吗?在 socket.io 的最新主要版本中,客户端不再与旧服务器兼容,反之亦然。

标签: node.js https socket.io


【解决方案1】:

努力之后:

  • 重新生成我的 Let's Encrypt 证书
  • 重新生成我的自签名证书(openssl)并通过服务器+客户端使用它们
  • 修补 socket.io connect 选项(安全、rejectUnauthorized、..)
  • 修补 nodejs 全局设置甚至 (process.env['NODE_TLS_REJECT_UNAUTHORIZED'])

我终于偶然发现了this page of github。它解决了我的问题,值得分享。

节点客户端

const https = require('https');
https.globalAgent.options.rejectUnauthorized = false;

const io = require('socket.io-client');
const sockets = io.connect('https://localhost:8001', {agent: https.globalAgent});

即使我更希望首先获得连接授权,这对我也有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2019-06-23
    • 2019-01-14
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多