web-dev-qa-db-fra.com

La connexion WebSocket a échoué: la prise de contact d'ouverture de WebSocket a été annulée

J'ai récemment configuré une instance EC2 (dans un VPC sans équilibreur de charge) et il est vrai que la configuration est un peu étrange, mais c'est ce qui est requis pour l'application Web que nous exécutons.

Le serveur Web (dans Haskell) fonctionne sur le port 4433 (les ports standard sont réservés pour une instance Apache) et reçoit des paquets UDP diffusés à partir d'un autre système. J'ai beaucoup de ports ouverts (juste pendant les tests) comme indiqué ici (à partir des groupes de sécurité):

Custom TCP Rule    4433     tcp 0.0.0.0/0   ✔
Custom TCP Rule    8080     tcp 0.0.0.0/0   ✔
SSH                22       tcp 0.0.0.0/0   ✔
HTTP               80       tcp 0.0.0.0/0   ✔
HTTPS              443      tcp 0.0.0.0/0   ✔
Custom UDP Rule    30090    udp 0.0.0.0/0   ✔
Custom UDP Rule    30089    udp 0.0.0.0/0   ✔

Le JavaScript pour le socket TCP fait une demande pour configurer le socket sur ce même port (en utilisant l'URL attribuée à l'adresse IP publique de l'AWS) et c'est là que la demande renvoie l'erreur:

La connexion WebSocket à "wss: // [URL]: 4433/projects/socket" a échoué: la prise de contact d'ouverture de WebSocket a été annulée.

La liaison du socket à 0.0.0.0 entraîne la même erreur.

Afin de démarrer le serveur Web Haskell, j'ai dû faire référence à l'IP interne fournie par AWS car elle ne s'exécuterait pas lors du référencement de l'IP public fournie par le service IP élastique. Pensant que c'est là que le problème est survenu, j'ai changé ma demande de socket en ceci ...

wss://[internal ip]:4433/projects/socket

Cela change l'erreur:

Échec de la connexion WebSocket à "wss: // [IP interne]: 4433/projets/socket": erreur lors de l'établissement de la connexion: net :: ERR_CONNECTION_REFUSED

Cette erreur est logique pour moi car l'IP interne n'est pas disponible pour le monde extérieur.

Tout ce que j'ai lu sur les websockets sur AWS implique un ELB (Elastic Load Balancer) et je n'en ai pas besoin. J'ai essayé toutes les choses dans toutes les réponses actuellement publiées (certaines questions n'ont même pas obtenu de réponses) sur SO en vain. J'ai également configuré un dossier de support avec Amazon ( il y a près de 24 heures) qui n'a pas reçu de réponse.

Information additionnelle

Navigation vers http://[URL]:4433/projects/socket renvoie 'WebSocket Available' où l'URL est celle que nous souhaitons utiliser ainsi que le DNS public fourni par AWS.

Fonctionnement netstat -plunt révèle ce qui suit:

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 [internal IP]:8080      0.0.0.0:*               LISTEN      -
tcp        0      0 [internal IP]:4433      0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 :::443                  :::*                    LISTEN      -
tcp6       0      0 :::80                   :::*                    LISTEN      -
udp        0      0 [internal IP]:30089     0.0.0.0:*                           -
udp        0      0 0.0.0.0:30090           0.0.0.0:*                           -
udp        0      0 0.0.0.0:11950           0.0.0.0:*                           -
udp        0      0 0.0.0.0:68              0.0.0.0:*                           -
udp6       0      0 :::38450                :::*                                -

Quelqu'un at-il eu un problème similaire avec les websockets sur AWS? Si oui, comment avez-vous résolu le problème?

16
Jay Blanchard

Il y avait une incompatibilité de certificat SSL entre le serveur Haskell et le serveur Apache.

Le serveur Haskell a dû être reconstruit avec des informations concernant les nouveaux certificats pour l'instance. Pour compliquer davantage la bibliothèque SSL appropriée (libssl0.9.8 libssl-dev) n'était pas installé sur l'instance EC2, ce qui me posait des problèmes lors de la reconstruction du serveur Haskell. Connaître une instance EC2 est un "canevas vierge" fait de l'absence de cette installation ma faute.

Une fois le libssl installé, j'ai pu reconstruire le serveur Haskell en le pointant vers les nouveaux certificats. Une fois que les certificats ont "correspondu", le problème de la prise Web a disparu.

Je le répète, la nôtre est une situation unique. Nous avons un serveur Apache (ports 80 et 443) et un serveur Haskell (ports 8080 et 4433) qui communiquent entre eux, effectuant une opération pub-sub sur les websockets. Une incompatibilité de certificat entre les deux serveurs (cela n'aurait pas d'importance quel type, il pourrait s'agir de plusieurs instances Apache) a provoqué un avertissement SSL. Tout avertissement de SSL supprimera toute tentative d'établir ou de maintenir une prise Web (d'où le message d'annulation de la poignée de main).

n autre article de StackOverflow a fourni quelques indices qui ont été extrêmement utiles au cours de ce processus. Plus précisément cet avertissement -

La clé du problème est la suivante: Si votre certificat SSL provoque un avertissement quelconque, les connexions wss: // WebSocket échouent immédiatement , et il y a aucun moyen canonique de détecter cela.

19
Jay Blanchard