Socket.io SSL 错误

问题描述 投票:0回答:4

我正在努力保护我的网站

一切都很好,直到我最终安装了 SSL 证书(来自 CloudFlare,不是自签名的)

所以问题是:当我通过 HTTP 打开我的网站时 - 一切正常,但是当我通过 https 打开它时 - 网站失去与主机的连接(需要工作)

在控制台中我可以看到:

socket.io-1.4.5.js:1 获取 https://188.226.131.219:8080/socket.io/?EIO=3&transport=polling&t=LlI-URk net::ERR_CONNECTION_CLOSED

如果我理解正确的话,这是端口的问题。使用HTTP端口80是可以的,使用https端口443有问题。有没有办法交换端口?

node.js sockets ssl socket.io ports
4个回答
3
投票

您可以尝试以下方法:

在node.js后端,将socket配置为:

var fs = require('fs');
var https = require('https');
var app = require('express')();


        var options = {
                key: fs.readFileSync('<.key location>'),
                cert: fs.readFileSync('<.cert location>')
        };
       var server = https.createServer(options, app);

server.listen(443, "0.0.0.0", function(){
        console.log('listening in port', 443);
});

在客户端应用程序中,您需要连接为:

 socket = io.connect(<server_ip>, {
            secure: true
        });

3
投票

我只是想把这个扔出去。这导致了我类似的错误,可能就是您正在寻找的错误。

socket.io 示例表示使用 IP 地址将客户端脚本连接到服务器。像这样的东西:

var socket = io.connect("https://123.45.6.78:443"); 

但是,一旦为 SSL 证书添加“A”记录,您需要使用“A”记录的主机名,而不是其指向的 IP 地址。像这样:

var socket = io.connect("www.mysite.com"); 

1
投票

您的前端似乎位于 http://188.226.131.219 并且您在 http://188.226.131.219:8080.

上有一个 WebSocket 服务。

您已将前端配置为使用 SSL 证书,并且可以通过 https://188.226.131.219 访问它,但是到您的 WebSocket 服务的链接可能取决于用于加载前端的协议和主机,因此如果您从https://188.226.131.219,那么前端中的 JS 将尝试连接到 https://188.226.131.219:8080,但你的 WebSocket 服务侦听 HTTP 请求,而不是 HTTPS 请求。

首先,您需要将 WebSocket 服务设置为也使用 SSL 证书,但是在不同的端口(例如 8443)上,然后您必须修改您的前端,使其能够了解其加载方式(使用 HTTP 或HTTPS)并找出 WebSocket 服务的正确端口。


0
投票

我知道这有点旧,由 @stzoannos 回答,但你实际上并不需要安装

express
才能使其正常工作。

我的工作是这样的:

const server = require("https");
const { Server } = require("socket.io");

const io = new Server({
    cors: {
      origin: "*",
    },
  });

  const folder = path.join(__dirname, "ssl");
  const privateKey = fs.readFileSync(
    path.join(folder, "server_key.pem"),
    "utf8"
  );
  const certificate = fs.readFileSync(
    path.join(folder, "server_cert.pem"),
    "utf8"
  );

  const SSL_CONFIG= {
    key: privateKey,
    cert: certificate,
    ca: [certificate],
    requestCert: false,certificate, tested and it works
    rejectUnauthorized: false,
  };

  const WEB_SERVER = server.createServer(SSL_CONFIG);

  WEB_SERVER.listen(1102);
  io.listen(WEB_SERVER);

您需要在

.pem
目录中有
ssl
文件。 请根据您的要求正确设置
cors

© www.soinside.com 2019 - 2024. All rights reserved.