IE10 上的 WebSocket 给出 SecurityError
Posted
技术标签:
【中文标题】IE10 上的 WebSocket 给出 SecurityError【英文标题】:WebSocket on IE10 giving a SecurityError 【发布时间】:2013-02-13 09:20:31 【问题描述】:我目前正在 IE10(在 Windows 8 上)下开发一个网站,使用 javascript 中的 WebSockets。它在 Firefox 18 和 Chrome 25 下运行良好,但在 IE10 上建立连接时出现 SecurityError。
我正在做的事情看起来很简单:
websocket = new WebSocket('wss://hello.dev.mydomain.net');
但是 IE 不喜欢它:
SCRIPT5022: SecurityError
脚本位于“https://test.dev.mydomain.net”(显然不是真实地址)。
困扰我的是,如果我只是双击本地计算机上的文件(例如 file://...),它就可以工作。更糟糕的是:如果我使用 fiddler 来监控 HTTP 流量......它也可以工作。而没有提琴手似乎根本没有连接,如 API 规范中所述。 (见下文。)
根据websocket spec 判断,Chrome/Firefox 上也应该出现异常......但它没有。所以我怀疑它是否与 HTTP/HTTPS 相关。无论如何,我在 httpS 页面上使用 wsS 套接字......此外:当我用在线示例中找到的另一个有效服务器替换 wss 地址时,它可以工作。
我不知道这是否相关,但来自 test.dev.mydomain.net 的 IP 是 10.14.x.x,其中 hello.dev.mydomain.net 是 194.247.x.x。我不知道它是否只能在 IE 上触发某种安全性...
还有一件事:我有一个 *.dev.mydomain.net 的证书,IE 似乎没有问题。该脚本最初驻留在名为 my.name.dev.mydomain.net 的服务器上,但由于我是从另一个 URL 访问它(我得到了一个重定向,因为我们最初认为它可能是某种同源策略问题),我不明白这有什么关系。至少我希望它不会……
欢迎任何想法。
编辑:将站点添加到受信任区域也不起作用。
【问题讨论】:
这个问题也出现在 FireFox 中,至少在 Windows 和 OSX 的最新版本中是这样。 我遇到了类似的问题,但从https://www.websocket.org/echo.html
启动到ws://
地址。显然它不允许从 SSL 页面打开非 SSL websocket,所以我不得不转到http://www.websocket.org/echo.html
,一切都很好。
正确的混合内容通常在安全页面访问非安全项目时被阻止。将 websocket 从ws://
协议切换到securewss://
将避免这种情况,但是您的websocket 需要实现安全套接字,并且使用的证书需要像任何其他SSL 证书一样受信任(手动安装或受信任--RootCA-中间的)。这应该类似于您从安全https://
页面加载非安全http://
<img ...>
标记时收到的问题,尽管不太清楚警告/错误消息。
从 http -> ws 与 IE11 位于同一域时出现此错误。
【参考方案1】:
如果您尝试在 本地(内联网) 域上打开 websocket,IE 似乎会引发 SecurityError。为了克服这个问题,您可以禁用 IE 识别本地站点的自动算法。这可以在Tools > Internet Options > Security > Local Intranet > Sites
中完成。
取消选中所有复选框(或仅选中一个特定的复选框,如果您知道您的域最终是如何进入 Intranet 的)。
请注意,IE 使用(除其他外)其代理设置来确定本地站点:如果您的域在代理设置中被列为排除在代理之外,那么它可能会被视为 Intranet 之一。这就是启用 Fiddler 后 WebSockets 工作的原因:它会修改 IE 代理设置,因此 Intranet 站点列表会发生变化。
【讨论】:
请注意,这也会影响 IE11。 这很好用,但它可能会破坏公司式局域网上某些类型的直通身份验证。【参考方案2】:我在 Windows7/IE11 中在应用安全补丁后遇到了这个问题。对于 Windows10/Edge 来说也是如此。
由于这是一个本地 websocket (ws://localhost),您必须将 ws:\\localhost\
添加到 Internet Explorer 配置(工具 > Internet 选项 > 安全 > 本地 Intranet > 站点 > 高级)。
在 Windows 10/Microsoft Edge 中,您将在控制面板 > Internet 选项中找到此配置。
更新
您的 web 应用程序的地址 (https://test.dev.mydomain.net) 也必须添加到 本地 Intranet 区域。 注意图片中需要添加webapp地址。
【讨论】:
【参考方案3】:好吧,我的问题没有那么成功,所以我将发布我找到的“解决方法”。
我得到了网站的另一个地址,194.247..。这神奇地解决了它。 Guess IE 不喜欢混合本地和外部的东西并监视 IP。
无论如何,我希望这对遇到同样问题的人有用。
如果您有通过配置 IE 解决“真正”问题的解决方案,请告诉我:)
干杯,
【讨论】:
@你好。我也有类似的问题。我使用 websockets 代替 ajax 来保存表单。如果我以不同的形式单击“保存”几次,则仅在 IE 中停止工作。 websocket 的控制台什么也没说。没有错误。仍然有效。 IE 控制台只显示SCRIPT5022: SecurityError
。想问一下,这个ws://localhost:8000
的123.456...
这样的地址怎么获取??如何将其转换为数字?谢谢...
嗯,我找到了this。也许会帮助你..
Slevin,顺便说一句,您为什么忽略用于保存表单的常规客户端/服务器 AJAX 模型?我想目前我们应该更喜欢常规模型,因为作为标准的 WebSockets 仍然存在一些问题,随着时间的推移会得到解决。
另一种解决方法是将公共 DNS 地址映射回本地计算机或网络。例如ws://fakelocalhost.duckdns.org/
指向 127.0.0.1
或任何您的本地端点。请注意,如果使用wss://
,您应该在与您的假域名匹配的两个地方都有受信任的 SSL 证书。这种“混合”问题在域网络上最为明显;即secretly changes the local security policy if not on a workgroup.【参考方案4】:
浏览器有 websocket 限制。例如,Internet Explorer 将 websocket 连接的默认限制设置为每个主机头名称 6 个。为 WinForms WebBrowser 组件设置了相同的限制。
解决方案是在注册表中的键 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_WEBSOCKET_MAXCONNECTIONSPERSERVER 下添加值。只需添加带有可执行文件名称的 DWORD 值,例如 iexplore.exe(或您的应用程序可执行文件名称,如果您使用 Web 浏览器组件)并从 2..128 范围内设置值
如何解决SecurityException的第二个选项是创建多个子域。
【讨论】:
【参考方案5】:客户端主机名/IP地址应与服务器IP/主机名相同,否则会出现上述错误。
1) 确保服务器主机名是否配置为侦听 IP/localhost 等,如果没有明确指定主机名 ast server
2) 在客户端使用相同的主机名。这将解决问题。它对我有用...
【讨论】:
如果他们不能呢?就像应用在本地运行而服务器在外部一样,反之亦然?【参考方案6】:我遇到了错误(虽然它没有说 SCRIPT5022 部分,而只是报告“ScriptError”)。我通过单击“受信任的站点”然后添加托管远程 websocket 的机器解决了这个问题。请注意,要添加到受信任的站点,
我必须提供不带“ws://”部分的地址(例如 mymahcine.mydomain.com)
我不得不取消选中“需要服务器验证 https://”选项。
完成添加域后,我重新选中了“需要服务器验证 (https://)。我建议每个人都这样做。取消选中该框只是添加不需要的站点的解决方法” t 以 https 开头(在我的情况下是 ws://)【讨论】:
hmmmmm 取消选中“需要服务器验证”可能不安全 哦,我在完成添加域后实际上重新选中了该框。取消选中该框只是一种解决方法,以便能够添加没有 https 前缀的域。 (否则它不会让我添加域)。我已经更新了我的答案,并提醒读者注意这一点。【参考方案7】:我在一个客户的环境中遇到了同样的问题。 原来他们有一个代理配置,不允许直接连接到 WebSocket 端点,也不支持 WebSocket 协议。 临时解决方案是禁用代理,一切都开始工作了。长期的解决方案是编辑代理的配置(.pac 文件)以排除 WebSocket 端点的地址。
要禁用代理,请转到:Internet Explorer 选项 > 连接选项卡 > LAN 设置按钮 > 取消选中自动检测设置。
希望这对某人有所帮助。
【讨论】:
【参考方案8】:除了确保 internet 区域不是 localhost(如上面的答案)外,还要确保如果使用 https,则应使用 wss。
这在其他浏览器中不是问题,但 IE 有点挑剔。
【讨论】:
以上是关于IE10 上的 WebSocket 给出 SecurityError的主要内容,如果未能解决你的问题,请参考以下文章
Titan Gremlin 服务器给出错误“不是 WebSocket 握手请求:缺少升级”
Firefox(和 IE)的 WebSocket 替代方案是啥