39 votes

Erreur HTTPS "data length too long" dans s3_pkt.c de Socket.io

Nous essayons de faire fonctionner les flashsockets de Socket.io dans Internet Explorer 9 via HTTPS/WSS. Les flashsockets fonctionnent sur HTTP, mais HTTPS nous pose problème. Nous utilisons socket.io version 0.8.7 et socket.io-client version 0.9.1-1.

Nous exécutons notre serveur websocket via SSL sur le port 443. Nous avons spécifié l'emplacement de notre fichier WebsocketMainInsecure.swf (il s'agit de requêtes ws inter-domaines) dans le bon emplacement, et nous chargeons le fichier dans l'objet swf embed via HTTPS.

Nous avons ouvert le port 843 dans notre groupe de sécurité pour notre instance EC2 et le fichier de politique d'origine croisée est rendu avec succès par HTTP. Il ne semble pas pouvoir être rendu en HTTPS (Chrome génère une erreur de connexion SSL).

Nous avons essayé deux versions du fichier WebsocketMainInsecure.swf. La première est le fichier fourni par Socket.io, qui est construit à partir de WebsocketMainInsecure.as qui n'inclut pas la ligne

Security.allowInsecureDomain("*");

L'erreur suivante apparaît SCRIPT16389: Unspecified error. au WebSocket.__flash.setCallerUrl(location.href) ligne.

Nous avons compris que c'était parce que le fichier SWF n'autorisait pas les requêtes HTTPS, nous avons donc remplacé le fichier WebSocketMainInsecure.swf par celui trouvé dans ce dépôt : https://github.com/gimite/web-socket-js parce qu'il comprend le

Security.allowInsecureDomain("*");

dans le code Actionscript. Lorsque nous avons utilisé cette ligne, nous avons constaté que la connexion flashsocket se déconnectait et se reconnectait sans cesse dans une boucle infinie. Nous avons trouvé l'erreur dans le fichier transport.js de la bibliothèque socket.io, dans la fonction onSocketError du prototype Transport. Elle génère l'erreur suivante :

[Error: 139662382290912:error:1408F092:SSL routines:SSL3_GET_RECORD:data length too long:s3_pkt.c:503:]

Nous avons même essayé de mettre à jour socket.io et socket.io-client à la version 0.9.6 et nous avons encore obtenu le message suivant Access is denied erreur.

Cette erreur a été très difficile à déboguer, et nous ne savons plus comment faire fonctionner les flashsockets. Nous nous demandons si cela n'a pas à voir avec l'utilisation d'une ancienne version de socket.io, ou peut-être que notre serveur de fichiers de politique n'accepte pas les demandes HTTPS, ou peut-être même la façon dont le fichier WebSocketMainInsecure.swf du repo github web-socket-js a été construit par rapport à ce que socket.io-client attend.

1voto

Stefan K. Points 1429

Je ne suis pas sûr que ça marche. Mais voici mon idée/suggestion :

  1. Idée : Je suppose que vous avez (peut-être) essayé d'accéder à une URL qui est trop longue. Cela se produit si les données sont souvent transmises via les paramètres GET. La limite officielle pour une URL est inférieure à 512 octets.

Détails : La spécification HTTP indique qu'une ligne de protocole ne peut pas dépasser 512 octets. Si elle est plus longue, le serveur risque de rejeter la demande ou d'être incapable de la traiter. La première ligne de HTTP avec un GET-requet est comme "GET /path/to?param1=data1&param2=data2&... HTTP/1.1" qui doit tenir dans 512 octets. Pour les requêtes POST, il n'y a pas de telle limitation...

Cependant, votre erreur semble provenir d'une implémentation SSL (openSSL ?): en se référant à s3_pkt.c à la ligne 503 (j'ai trouvé un fichier comme celui-ci ici : http://www.opensource.apple.com/source/OpenSSL/OpenSSL-7.1/openssl/ssl/s3_pkt.c ) mais semble être différent ; je ne connais pas les détails, et je ne fais que spéculer : Je ne connais pas les détails et je ne fais que spéculer : je pourrais penser que l'implémentation d'openSSL a un support limité pour les longues requêtes GET (car elles ne sont pas conformes au HTTP) et les rejette simplement de cette façon...

Je vois ces possibilités maintenant : 1. Solution : Utilisez POST au lieu de GET-Requests pour transmettre des ensembles de données plus longs. Voir si cela fonctionne... 2. Essayez de remplacer votre installation openssl ou libopenssl sur le serveur utilisé ; elle est peut-être cassée ou périmée ? 3. Essayez de demander de l'aide aux développeurs d'openssl...

J'espère que cela vous aidera...

1voto

jww Points 9514

Essayez de construire OpenSSL avec SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER (crédit à Steven Henson et Jaaron Anderson de la liste de diffusion OpenSSL).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X