在 Electron 主进程中使用 socket.io 时无法识别可信证书

问题描述

我有一个运行 Express 和 socket.io 2.3.0 的服务器,以及一个主进程 中运行 socket.io-client 2.3.0 的 Electron 应用。 我的服务器已签署(受信任的)证书。

从浏览器或渲染器进程中,连接按预期工作。但是从 Electron 的主进程中,我必须在 socket.io-client 选项中设置 rejectUnauthorized: false 才能连接,否则我会得到一个带有代码 TransportErrorUNABLE_TO_VERIFY_LEAF_SIGNATURE

问题是,当连接时,没有收到我对服务器的查询。我怀疑“证书”问题是这种行为的根源。

查询示例

// This works: see UPDATE
socket.emit('db:[...PRIVATE...].count',(data: any) => {
  console.log(data)
})

// or

// Credentials are removed from the payload: see UPDATE
socket.emit('db:[...PRIVATE...].in',credentials,(data: any) => {
  console.log(data)
})

抛出这个:

...
engine.io-client:socket flushing 1 packets in socket
engine.io-client:websocket websocket closed before onclose event
...

配置

服务器端

SERVER = https.createServer({
  key: CONfig.certificates.key,cert: CONfig.certificates.cert
},app);
// Listen to the HTTPS port
SERVER.listen(CONfig.ports.https)
// Listen to the HTTP port
app.listen(CONfig.ports.http,CONfig.host)

const pingTimeout = 7000
const pingInterval = 3000
const io = SocketIO.listen(httpsServer,{
  pingTimeout,pingInterval
})

客户端(Electron 的主进程):

SOCKET = io(`${process.env.[...PRIVATE...]!}`,{ 
  reconnection: true,secure: true,rejectUnauthorized: false,// LINE BELOW: Tested with and without
  // transports: ["websocket"]
})

Electron 应用在 macOS 10.14.6 上运行,sandBoxcontextIsolation 为 true,nodeIntegration 为 false。在生产模式下,权利包括 com.apple.security.network.servercom.apple.security.network.client

需要传递 rejectUnauthorized 选项的原因可能是什么?这种行为是否是安全问题的结果?

更新

20210505

实际上第一个例子的问题只是因为打字错误

但是,我发现 socket.io 如果在有效负载中检测到电子邮件,甚至仅检测到属性“电子邮件”或“密码”,就会删除凭据。所以,我想问题仍然存在:如何让 socket.io 识别这些证书,以便能够向服务器发出凭据?

相关:

更新

20210507

从 2.3.0 版升级到 4.0.2 版 解决了凭据“自动删除”的问题,但没有解决了需要通过 {{ 1}} 选项。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)