【问题标题】:Implementing https and socket io实现 https 和 socket io
【发布时间】:2021-12-03 11:13:57
【问题描述】:

我一直在为此寻找高低,但未能找到解决方案。我在服务器中有以下代码:

import express from 'express';
import { createServer } from 'https';
import { Server } from "socket.io";
import fs from 'fs';

const app = express();

const credentials = {
        key: fs.readFileSync('../key.pem'),
        cert: fs.readFileSync('../cert.pem')
};

// create http/https server
const server = createServer(credentials, app);

const io = new Server(server);

io.on('connection', (socket) => {
  console.log('a user connected');
});

server.listen(3000, () => {
        console.log('listening on localhost:3000');
}); 

现在在客户端我有:

import { io } from "socket.io-client";
import fs from "fs";

const socket = io("https://localhost:3000", {
        rejectUnauthorized: false,
        ca: fs.readFileSync("../cert.pem") 
});

socket.on("connect", () => console.log("connected to server"));

如果我更改要导入的服务器端:

import { createServer } from 'http'; 

代替:

import { createServer } from 'https'; 

我将客户端更改为:

const socket = io("http://localhost:3000"); 

代替:

const socket = io("https://localhost:3000"); 

我的socket io可以正常通信

这只是https。我尝试添加证书并设置

rejectUnauthorized: false

无济于事。我找到了this 问题,但没有任何效果。 socket io 文档并没有太大帮助。接下来我可以尝试什么?

【问题讨论】:

  • 您应该启用调试日志,以便了解 SSL 不起作用的原因。
  • @Pilpo 我如何在 nodejs 中做到这一点?
  • 也许这会有所帮助:stackoverflow.com/a/21651419/5734311

标签: javascript node.js websocket socket.io


【解决方案1】:

由于 HTTPS 将尝试在 127.0.0.1 拒绝,WSS 也会尝试拒绝,但无法绕过正确的?

在开发过程中,大多数用户最初都会碰壁,直到他们有更多时间正确设置。

将此代码插入到您的 Web 套接字服务器文件中。

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

你只在开发中使用它,它永远不会在生产中使用。

【讨论】:

  • 请在发布答案之前检查重复项
  • 我知道,我做到了,但其他问题都没有解决我的问题。
  • 通常只是绕过安全功能的问题;您提供的证书也可能不适合本地开发,我已经看过几次,因此即使绕过也根本不允许安全连接。因此,换句话说,如果您没有生成这些证书,就放弃他们重写新证书以进行测试并忙碌起来。 :)
  • @blanknamefornow,谢谢您的回答。虽然还是不行。您认为这与自签名证书有关吗?它可以与其他类型的证书一起使用吗?
  • 是的,我已经生成了两次证书。
【解决方案2】:

在您的应用程序中实现 https 的最佳选择是在“真正的”http 服务器上进行。例如:nginxApache、...

您直接从 Node 获得的内容足以用于开发目的,但不建议在真实环境中使用它。如果只是因为它平均处理 Keep-Alive 连接。 (这是您最快的体验。)

接下来是性能和可扩展性问题。您必须记住,Node 应用程序基本上是单线程的。对于许多客户,即使是“愚蠢的”cors 请求也会占用本可用于实际客户服务的资源。

您知道您可以运行 Node 应用程序的多个实例吗? (正确管理共享数据就足够了)这可以做到,例如通过 nginx 中的upstream。或使用例如Phusion Passenger(它将在意外崩溃后立即管理应用程序重启,而不是像 pm2 这样的管理器)

【讨论】:

  • 感谢@Bato3,这是很棒的提示。在服务器中部署时,我肯定会使用它们。 !
  • 是的,我有点放弃了让 HTTPS 在开发中工作的尝试。我认为这是一个我现在可能比以后更好地解决的问题,但现在我意识到以后实际解决它可能更容易。感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 2014-10-18
相关资源
最近更新 更多