IE10上的WebSocket给出了一个SecurityError

问题描述 投票:42回答:8

我目前正在使用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流量......它也有效。然而,如果没有fiddler似乎没有任何联系,详见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访问它(因为我们首先认为它可能是某种同源策略问题,所以我得到了重定向),不明白它是如何重要的。至少我希望它不......

欢迎任何想法。

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

javascript websocket internet-explorer-10
8个回答
50
投票

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

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

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


8
投票

应用安全补丁后,我在Windows 7 / IE11中遇到此问题。对于Windows 10 / Edge来说是同样的故事。

由于这是本地websocket(ws:// localhost),因此您必须将ws:\\localhost\添加到Internet Explore配置(工具> Internet选项>安全性>本地Intranet>站点>高级)。

IE11 local intranet sites configuration

在Windows 10 / Microsoft Edge中,您将在“控制面板”>“Internet选项”中找到此配置。

UPDATE

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


7
投票

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

我在194.247也得到了该网站的另一个地址。神奇地解决了这个问题。猜猜IE不喜欢混合本地和外部的东西并观看IP。

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

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

干杯,


3
投票

浏览器具有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是创建多个子域。


1
投票

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

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

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


0
投票

我遇到了错误(虽然它没有说SCRIPT5022部分,而只是报告“ScriptError”)。我通过点击“可信站点”然后添加托管远程websocket的计算机解决了这个问题。注意,要添加到受信任的站点,

  • 我不得不提供没有“ws://”部分的地址(就像mymahcine.mydomain.com一样)
  • 我必须取消选中“要求服务器验证https://”选项的框。
  • 在我添加域名后,我重新选中了“要求服务器验证(https://)”框。我建议大家也这样做。取消选中此框只是一种解决方法,可以添加不以https(相反ws://在我的情况下)

0
投票

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

要禁用代理,请转到:Internet Explorer选项>连接选项卡>局域网设置按钮>取消选中自动检测设置。

希望这有助于某人。


0
投票

除了确保Internet区域不是localhost(如上面的答案)之外,请确保如果使用https,则应使用wss。

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.