跨域 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的主要内容,如果未能解决你的问题,请参考以下文章