IE10上的WebSocket给出了一个SecurityError

时间:2013-02-27 14:14:30

标签: javascript websocket internet-explorer-10

我目前正在使用JavaScript中的WebSockets在IE10(Windows 8)下开发一个网站。它在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访问它(因为我们首先认为它可能是某种同源策略问题,所以我得到了重定向),不知道它是如何重要的。至少我希望它不会......

欢迎任何想法。

编辑:将网站添加到受信任区域也不起作用。

8 个答案:

答案 0 :(得分:49)

如果您尝试在本地(Intranet)域上打开websocket,IE看起来会抛出SecurityError。要解决此问题,您可以禁用IE的自动算法来识别本地站点。这可以在Tools > Internet Options > Security > Local Intranet > Sites

中完成

intranet detection settings

取消选中所有复选框(或者只有特定的复选框,如果您知道您的域在Intranet中的确切结果)。

请注意,IE使用(其中包括)其代理设置来确定本地站点:如果您的域名在代理设置中被列为从代理中排除,那么它可能会被视为内部网站。这就是为什么WebSockets在启用Fiddler时可以工作的原因:它修改了IE代理设置,因此内部网站点列表也发生了变化。

答案 1 :(得分:7)

好吧,我的问题不是那么成功,所以我会发布我发现的“解决方法”。

我在194.247。的网站上有另一个地址。神奇地解决了这个问题。猜猜IE不喜欢混合本地和外部的东西并监视IP。

无论如何,我希望这对任何遇到同样问题的人都会派上用场。

如果您有通过配置IE来解决“真正”问题的解决方案,请告诉我:)

干杯,

答案 2 :(得分:6)

在应用安全补丁后,我在Windows7 / IE11 中遇到此问题。对于Windows10 / Edge来说是同一个故事。

由于这是本地websocket(ws:// localhost),您必须将var BaseViewModel = function(options) { var initialise = function(options) { if (options) { if (options.template) { instance.template = options.template; } } }; var getTemplateId = function() { return instance.template.Id; }; var instance = { template: null, initialise: initialise, getTemplateId: getTemplateId } return instance } 添加到Internet Explore配置(工具> Internet选项>安全>本地Intranet>网站>高级)。

IE11 local intranet sites configuration

Windows 10 / Microsoft Edge 中,您将在控制面板>中找到此配置。互联网选项。

<强>更新

您的网络地址(https://test.dev.mydomain.net)的地址也必须添加到本地Intranet区域注意图片中应添加webapp地址。

答案 3 :(得分:2)

浏览器具有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的第二种方法是创建多个子域。

答案 4 :(得分:1)

客户端主机名/ IP地址应与侦听的服务器IP /主机名相同,否则会出现上述错误。

1)确保服务器主机名是否配置为侦听IP / localhost等,如果没有明确指定主机名ast服务器

2)在客户端使用相同的主机名。这将解决问题。它对我有用......

答案 5 :(得分:0)

我遇到了错误(虽然它没有说SCRIPT5022部分,而只是报告&#34; ScriptError&#34;)。我通过点击&#34; Trusted Sites&#34;来解决这个问题。然后添加托管远程websocket的机器。注意,要添加到可信站点,

  • 我必须提供没有&#34; ws://&#34;的地址。部分(如mymahcine.mydomain.com)

  • 我必须取消选中“#34;要求服务器验证https://&#34;选项。

  • 完成添加域名后,我重新选中了“#34;要求服务器验证(https://)”框。我建议大家也这样做。取消选中此框只是一种解决方法,可以添加不以https开头的网站(在我的情况下为ws://)

答案 6 :(得分:0)

我在客户的某个环境中遇到了同样的问题。 事实证明,他们有一个代理配置,不允许直接连接到WebSocket端点,并且不支持WebSocket协议。 临时解决方案是禁用代理,一切都开始工作。长期解决方案是编辑代理的配置(.pac文件)以排除WebSocket端点的地址。

要禁用代理,请转到:Internet Explorer选项&gt; “连接”标签&gt; 取消选中自动检测设置。

希望这有助于某人。

答案 7 :(得分:0)

除了确保Internet区域不是本地主机(如上述答案)外,请确保如果使用https,则应使用wss。

这不是其他浏览器中的问题,但是IE有点挑剔。

enter image description here