跨域 Websocket 连接导致 NS_ERROR_DOM_SECURITY_ERR

Posted

技术标签:

【中文标题】跨域 Websocket 连接导致 NS_ERROR_DOM_SECURITY_ERR【英文标题】:Cross Domain Websocket connection causing a NS_ERROR_DOM_SECURITY_ERR 【发布时间】:2012-04-26 11:34:28 【问题描述】:

我正在尝试从 trial.domain.com 连接到 server.domain.com 上的 websocket

Firefox 中的 NS_ERROR_DOM_SECURITY_ERR:

"[Exception... "Security error" code: "1000" nsresult: "0x805303e8 (NS_ERROR_DOM_SECURITY_ERR)" location: "https://trial.domain.com/home Line: 454"]"

当我尝试建立 WebSocket 连接时:

try 
  if (window['MozWebSocket'] !== undefined) 
    socket = new MozWebSocket('ws://server.domain.com/chat');
   else 
    socket = new WebSocket('ws://server.domain.com/chat');
  
  trails = 0;
 catch(err)
  trials++;

【问题讨论】:

你不应该使用用户代理嗅探来确定是否使用MozWebSocket,你应该寻找WebSocket构造函数,只有当你找不到它时才尝试MozWebSocket构造函数。 【参考方案1】:

这种情况是由应用安全策略的浏览器发生的,该策略阻止使用对页面自身托管的外部域的任何访问。 这发生在您尝试从 SSL 区域获取重要连接到非 SSL 和另一个域(不知道同一个域是否会解决问题)的情况下 - 这就是您的情况。但是还有更多可能的情况。

这是浏览器相关的错误,是浏览器抛出这个错误,自己连接没有问题。

您必须将 WebSockets 服务器托管在与 http 服务器相同的域下。如果这不可能,您可以采取以下几种方法:

    如果软件是供内部使用的,并且可以在浏览器中进行设置以供使用,那么您可以禁用跨域安全策略: Firefox,在“about:config”下将 s“ecurity.fileuri.strict_origin _policy”设置为“false”。 Chrome,使用标志“--allow-file-access-from-files”运行 如果您有权访问域的 DNS 设置,则可以创建子转发器,看起来您正在连接到同一个域。在练习中不确定这个选项,但看起来不错。

【讨论】:

WebSockets 是为了支持跨域通信而开发的,所以我认为问题的原因不太可能是 Web 浏览器。我认为服务器更有可能以某种方式拒绝连接。见Origin/security considerations in the WebSocket RFC 请提供 Firefox 的版本。正如我看到的,您正在从 HTTPS 区域转到非 SSL(ws://,但不是 wss:://)。这可能会导致问题。如果您使用 SSL,那么您应该使用 WSS - 它是 WebSockets SSL。 切换到 wss 解决了安全问题。但我仍然无法连接到套接字。我认为我的 nginx 配置不正确。 这是一个关于 Nginx 配置的新问题:***.com/questions/10381412/nginx-config-for-wss

以上是关于跨域 Websocket 连接导致 NS_ERROR_DOM_SECURITY_ERR的主要内容,如果未能解决你的问题,请参考以下文章

跨域 WebSocket 连接 [Spring Boot]

无法创建到 Node.js socket.io 服务器的跨域 websocket 连接

关于websocket跨域的一个奇怪问题

websocket 可以跨域吗

tcp协议;websocket协议;同源策略和跨域

关于 websocket 跨域的一个奇怪问题…