我们正在尝试让 Socket.io flashsockets 通过 HTTPS/WSS 在 Internet Explorer 9 中工作。flashsockets 可以通过 HTTP 工作,但 HTTPS 给我们带来了问题。我们使用的是 socket.io 版本 0.8.7 和 socket.io-client 版本 0.9.1-1。
我们在端口 443 上通过 SSL 运行我们的 websocket 服务器。我们已经在正确的位置指定了我们的 WebsocketMainInsecure.swf 文件(这些是跨域 ws 请求)的位置,并且我们正在通过 HTTPS 在 swfobject 嵌入中加载该文件。
我们在安全组中为 EC2 实例打开了端口 843,跨源策略文件已成功通过 HTTP 呈现。它似乎无法通过 HTTPS 呈现(Chrome 会抛出 SSL 连接错误)。
我们尝试了两个版本的 WebsocketMainInsecure.swf 文件。第一个是 Socket.io 提供的文件,它基于不包含以下行的 WebsocketMainInsecure.as 构建
Security.allowInsecureDomain("*");
这会导致SCRIPT16389: Unspecified error.
错误WebSocket.__flash.setCallerUrl(location.href)
。
我们认为这是因为 SWF 文件不允许 HTTPS 请求,因此我们用在该 repo 中找到的文件替换了 WebSocketMainInsecure.swf 文件:https://github.com/gimite/web-socket-js因为它包括
Security.allowInsecureDomain("*");
ActionScript 代码中的行。当我们使用它时,我们看到 flashsocket 连接不断断开并重新连接,陷入无限循环。我们在 Transport 原型上的 onSocketError 函数中将错误追踪到 socket.io 库中的 transport.js 文件。它抛出错误:
[Error: 139662382290912:error:1408F092:SSL routines:SSL3_GET_RECORD:data length too long:s3_pkt.c:503:]
我们猜测这个错误可能与我们的 ssl 通配符子域证书有关,但我们不确定。
我们甚至尝试将 socket.io 和 socket.io-client 都更新至 0.9.6 版本,但仍然收到访问被拒绝错误。
这个错误很难调试,现在我们不知道该如何让 flashsockets 工作。我们想知道这是否与使用旧版本的 socket.io 有关,或者可能是我们的策略文件服务器不接受 HTTPS 请求,或者甚至是 web-socket-js github repo 中的 WebSocketMainInsecure.swf 文件的构建方式与 socket.io-client 的期望不符。
任何帮助是极大的赞赏!
答案1
看起来它已经超越了 XSS 控制,并且猜测 SSL 错误看起来像是因为你的 websocket 客户端没有连接到 SSL websocket。
使用以下方法验证您的 SSL websocket:openssl s_client -connect servername:websocketport
您应该会看到 SSL 证书的转储以及其是否受信任。如果您知道如何复制 websocket 客户端,您还可以发出请求。
另外,使用 Wireshark / Tcpdump 来验证哪些端口正在打开。来自网络部分和 Chrome 开发者工具控制台的转储可能会提供有用的信息。