【问题标题】:apache ssl (443) node.js ssl (8081). Client can't find socket.io.jsapache ssl (443) node.js ssl (8081)。客户端找不到 socket.io.js
【发布时间】:2015-09-06 23:59:18
【问题描述】:

我在这上面花了两天时间。希望有人知道答案。

我有一个在端口 443 上运行 SSL 的 apache 服务器。 我有一个在 8081 端口上运行 SSL 的 node.js 服务器。

在客户端中,我尝试包含 socket.io/socket.io.js 文件,如下所示:

<script src="https://my_url.com:8081/socket.io/socket.io.js"></script>

我没有收到 404(未找到)。在 Chrome javascript 控制台中,我得到 Status = (failed) 和 Type = undefined。我已经尝试过我找到的建议(使用 src="localhost.." 等,但它们也不起作用)。

它适用于我的 http 版本。我包含这样的文件:

<script src="http://my_url.com:8080/socket.io/socket.io.js"></script>

不知道为什么 SSL 版本不工作。有任何想法吗?提前致谢!!

【问题讨论】:

  • 你能更详细地解释一下系统的架构吗,我不明白为什么你有两台服务器运行 ssl 以及谁提供脚本
  • 我正在使用 apache 为我的 php 页面提供登录等服务。然后应用程序页面包括所有脚本文件等。这就是我调用 socket.io.js 的地方。如果我不制作 node.js ssl,那么我会收到警告“...从my_url.com:8080/socket.io/socket.io.js 提供不安全的内容”。
  • 我无法让节点 https 服务器工作。但找到了另一个解决方案。我正在使用 Amazon 负载均衡器来终止 SSL 并将 http 发送到节点服务器。它工作得很好。我对我的 SSL Apache 流量做同样的事情。仅供参考 - 如果你走这条路,你需要在负载均衡器中使用 TCP (SSL) 和 TCP 选项来处理节点流量。

标签: apache node.js ssl amazon-web-services socket.io


【解决方案1】:

根据您的评论,我猜您遇到了 CORS 问题:

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

如果您更改协议,则遵循同源策略的源是不同的。您必须为此添加一个标题。

https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript?redirectlocale=en-US&redirectslug=Same_origin_policy_for_JavaScript

关于不安全内容的警告提示了导致问题的原因:您正在尝试通过脚本访问一个来源,该脚本不是该脚本的来源。这是一个安全问题,因为它可能会导致泄漏,从而允许将有害脚本注入页面

【讨论】:

  • 浏览器处理这个问题的方式非常不同。有些加载脚本但不执行它们有些向站点发送 OPTIONS 请求并拒绝加载脚本
  • 我调查了这个。但我不明白为什么我的 http 版本有效:
  • 看来我的 node.js ssl 设置可能有问题。我只是尝试直接在浏览器中访问链接并获得安全链接的 SSL 错误,但会显示不安全的 socket.io.js 文件。
  • 在这种情况下,您应该在此处发布您的 node.js 代码(只需编辑您的第一篇文章),否则我无法找到问题所在。一个好方法是在浏览器中使用开发人员工具并检查网络选项卡。例如。在 Chrome F12 中,然后在网络标签中
  • 好的,谢谢。我认为问题在于我在节点端使用了自签名证书,而不是我购买并安装在我的 apache 服务器上的 CA。我要解决这个问题,看看问题是否仍然存在。
【解决方案2】:

不要将 ProxyPass 设置为 Localhost!这不行!

在您的 Apache 配置中执行此操作:

<VirtualHost *:443>
    ServerName domain.com
    SSLProxyEngine On
    RequestHeader set Front-End-Https "On"
    ProxyPass / https://domain.com:3000/ retry=1 acquire=3000 timeout=600 Keepalive=On
    ProxyPassReverse / https://domain.com:3000/

    SSLEngine on
    SSLCertificateKeyFile    /etc/ssl/private/domain.com.key
    SSLCertificateFile       /etc/ssl/certs/domain.com.crt
    SSLCertificateChainFile  /etc/ssl/certs/chaincert.crt
</VirtualHost>

现在,Nodejs 也可以拥有 SSL:

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

var ssl_options = {
    key: fs.readFileSync('/etc/ssl/private/domain.com.key'),
    cert: fs.readFileSync('/etc/ssl/certs/domain.com.crt'),
    ca: fs.readFileSync('/etc/ssl/certs/domain.com.ca')
};

var server = require('https').createServer(ssl_options, app);
var port = process.env.PORT || 3000;

var io = require('socket.io')(server);

server.listen(port, function(err) {
    console.log(colors.green('https server running on port ' + port));
});

在您的客户端中执行此操作:

var socket = io.connect('https://domain.com:3000', { path: '/socket.io', 'flash policy port': 3000 });

对我来说,这很好用!

【讨论】:

    猜你喜欢
    • 2017-07-08
    • 2013-10-22
    • 2022-01-26
    • 2010-10-29
    • 2013-10-29
    • 2019-04-19
    • 2013-01-01
    • 1970-01-01
    • 2013-06-20
    相关资源
    最近更新 更多