【问题标题】:Can't connect to server after switching to HTTPS切换到 HTTPS 后无法连接到服务器
【发布时间】:2017-12-20 16:58:01
【问题描述】:

所以我切换到 HTTPS,除了套接字之外,一切都运行良好。

如果我尝试使用 HTTP 访问网站,则套接字会连接,但如果我尝试使用 HTTPS 连接,则会得到:

控制台错误:

Failed to load resource: net::ERR_CONNECTION_CLOSED
Failed to load resource: net::ERR_CONNECTION_CLOSED
Failed to load resource: net::ERR_CONNECTION_CLOSED
Failed to load resource: net::ERR_CONNECTION_CLOSED

前端:

function connect()
{
    if (!SOCKET)
    {
        var hash = getCookie('hash');
        if (hash == "") {
            //$.notify('You must login!', 'success');
        }
        if (hash != "") {
            $.notify('Connecting...', 'success');
        }
        SOCKET = io(':3001');
        SOCKET.on('connect', function(msg) {
            if (hash != "") {
                //$.notify('Connected!', 'success');
            }
            SOCKET.emit('hash', {
                hash: hash
            });
            $('#games tr').remove();
        });
        SOCKET.on('connect_error', function(msg) {
            $.notify('Connection lost!', 'success');
        });
        SOCKET.on('message', function(msg) {
            onMessage(msg);
        });

        SOCKET.on('disconnect', function(m) {
            SOCKET.emit('disconnect', {
                uhash: hash
            });
        });
    }
    else
    {
        console.log("Error: connection already exists.");
    }
}

Node.js/后端

var httpsOptions = {
  cert: fs.readFileSync("/path/to/cert/cert.pem"),
  ca: fs.readFileSync("/path/to/cert/chain.pem"),
  key: fs.readFileSync("/path/to/cert/privkey.pem"),
}

var server = require('https').createServer(httpsOptions);
var io = require('socket.io').listen(server);
server.listen(3001);

【问题讨论】:

  • 实际错误是什么?
  • 套接字未连接..
  • 又名我失去了连接!
  • 我不是 HTTPS 证书方面的专家,但那些真的能够申请到 3001 端口吗?我认为这行不通。
  • 我想端口 3001 是内部的,由 Apache 访问。我强烈建议将 Apache 用于 HTTPS 而不是 Node。

标签: html node.js websocket socket.io


【解决方案1】:

您的 Node 应用程序应该只接受 HTTP 连接。您的 Apache 服务器应该负责 HTTPS。这可以简化您的应用,并允许 Apache 在您决定这样做时为您进行负载平衡。

所以你的应用程序和 Apache 之间应该是 HTTP,然后是 Apache 和客户端之间的 HTTPS。有很多关于如何做到这一点的指南,我建议阅读official documentation

如果您决定不这样做,并在网络应用程序级别实施 SSL(不推荐),那么我们将需要更多信息。

【讨论】:

  • 那么node.js服务器可以和http.createserver保持HTTP状态吗?
  • 是的,您应该将 Node 服务器绑定到 127.0.0.1,以便它只能在内部访问,然后让 Apache 代理连接到它。因此 Apache 将接收 HTTPS 连接,然后通过 HTTP 将数据传递给 Node。这在安全性方面很好,因为它是一种内部通信。
  • 顺便说一句,HTTPS 已经可以正常工作了,除了 Socket.IO 没有连接。
  • 哦,对了。您可以使用 Postman 等程序与它进行交互吗?
  • 应该可以,因为 Node.js 服务器没有给出任何错误。我很确定前端js有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 2012-03-24
  • 2016-11-19
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多