问题描述
我有一个运行 Express 和 socket.io 2.3.0 的服务器,以及一个在 主进程 中运行 socket.io-client 2.3.0 的 Electron 应用。 我的服务器已签署(受信任的)证书。
从浏览器或渲染器进程中,连接按预期工作。但是从 Electron 的主进程中,我必须在 socket.io-client 选项中设置 rejectUnauthorized: false
才能连接,否则我会得到一个带有代码 TransportError
的 UNABLE_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 上运行,sandBox 和 contextIsolation 为 true,nodeIntegration 为 false。在生产模式下,权利包括 com.apple.security.network.server
和 com.apple.security.network.client
需要传递 rejectUnauthorized
选项的原因可能是什么?这种行为是否是安全问题的结果?
更新
20210505
但是,我发现 socket.io 如果在有效负载中检测到电子邮件,甚至仅检测到属性“电子邮件”或“密码”,就会删除凭据。所以,我想问题仍然存在:如何让 socket.io 识别这些证书,以便能够向服务器发出凭据?
相关:
更新
20210507
将从 2.3.0 版升级到 4.0.2 版 解决了凭据“自动删除”的问题,但没有解决了需要通过 {{ 1}} 选项。
- https://socket.io/docs/v3/migrating-from-2-x-to-3-0/
- https://socket.io/docs/v3/migrating-from-3-x-to-4-0/
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)