来自Socket.io的s3_pkt.c中的HTTPS错误“数据长度太长”

我们试图通过HTTPS / WSS让Socket.io flashsockets在Internet Explorer 9中工作。 闪存卡通过HTTP工作,但HTTPS给我们带来了问题。 我们使用socket.io版本0.8.7和socket.io-client版本0.9.1-1。

我们通过端口443上的SSL运行我们的websocket服务器。我们已经在正确的位置指定了我们的WebsocketMainInsecure.swf文件的位置(这些是跨域ws请求),并且我们正在swfobject中embedded文件通过HTTPS。

我们在我们的EC2实例的安全组中打开了端口843,跨源策略文件成功通过HTTP呈现。 它似乎不通过HTTPS呈现(Chrome会引发SSL连接错误)。

我们已经尝试了两个版本的WebsocketMainInsecure.swf文件。 首先是由Socket.io提供的文件,它由WebsocketMainInsecure.as构build,不包含行

Security.allowInsecureDomain("*"); 

这会引发错误SCRIPT16389: Unspecified error.WebSocket.__flash.setCallerUrl(location.href)一行。

我们认为这是因为SWF文件不允许HTTPS请求,所以我们用在这个repo上find的文件replace了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:] 

我们甚至试着将socket.io和socket.io-client更新到版本0.9.6,我们仍然得到了Access is denied错误。

这个错误非常难以debugging,现在我们不知道如何让FlashSocket工作。 我们想知道是否可能需要使用旧版本的socket.io,或者我们的策略文件服务器不接受HTTPS请求,或者甚至可能来自Web的WebSocketMainInsecure.swf文件, socket-js github repo是根据socket.io-client的期望build立的。

我不确定天气是否有效。 但这是我的想法/build议:

  1. 想法:我认为你(可能)试图访问一个URL太长。 如果数据经常通过GET参数传输,则会发生这种情况。 官方对URL的限制是低于512字节。

详细信息:HTTP规范说协议行最多可以有512字节。 如果服务器可能拒绝请求,或者可能无法处理请求。 HTTP中的第一行是GET-requet,就像“GET / path / to?param1 = data1&param2 = data2&… HTTP / 1.1”,需要512字节。 对于POST请求,没有这样的限制。

然而,你的错误似乎来自一些SSL实现(openSSL?):引用s3_pkt.c在503行(我发现这样一个文件在这里: http : //www.opensource.apple.com/source/OpenSSL/OpenSSL- 7.1 / openssl / ssl / s3_pkt.c ),但似乎有所不同; 我不知道细节,只是猜测:我可以想到,openSSL实现有一些有限的支持长的GET请求(因为它们不符合HTTP),只是这样拒绝它们…

我现在看到这些可能性:1.解决scheme:使用POST而不是GET-Requests来传输更长的数据集。 看看这是否工作… 2.尝试replace你使用的服务器上的openssl-installation或libopenssl; 它可能已经坏了或过时了? 3.尝试从openssl开发人员请求一些帮助…

希望有帮助…

尝试使用SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER构buildOpenSSL(从OpenSSL邮件列表中授予Steven Henson和Jaaron Anderson)。