web-dev-qa-db-ja.com

WebSocket接続に失敗しました:WebSocketオープニングハンドシェイクがキャンセルされました

私は最近(ロードバランサーのないVPCで)EC2インスタンスをセットアップしましたが、確かに構成は少し奇妙ですが、実行しているWebアプリケーションに必要なものです。

Webサーバー(Haskell内)はポート4433で実行され(標準ポートはApacheインスタンス用に予約されています)、別のシステムからブロードキャストされるUDPパケットを受信して​​います。ここに示されているように(テスト中に)多くのポートが(セキュリティグループから)広く開いています:

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   ✔

TCPソケットのJavaScriptは、AWSのパブリックIPに割り当てられたURLを使用して、この同じポートでソケットをセットアップするリクエストを行います。リクエストがエラーを返します。

「wss:// [URL]:4433/projects/socket」へのWebSocket接続に失敗しました:WebSocketのハンドシェイクをキャンセルしました。

ソケットを0.0.0.0にバインドすると、同じエラーが発生します。

Haskellウェブサーバーを起動するには、AWSが提供する内部 IPを参照する必要がありました。これは、エラスティックIPサービスが提供するpublic IPを参照すると実行されないためです。これが問題が発生した場所だと思って、ソケット要求をこれに変更しました...

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

これによりエラーが変わります。

「wss:// [内部IP]:4433/projects/socket」へのWebSocket接続に失敗しました:接続の確立エラー:net :: ERR_CONNECTION_REFUSED

内部IPは外部の世界では利用できないため、このエラーは理にかなっています。

AWSのwebsocketで読んだものにはすべてELB(Elastic Load Balancer)が関係しており、それらのいずれかは必要ありません。 SOは利用できません。また、Amazonでサポートケースをセットアップします(質問の一部は答えさえもらえていません)で、現在投稿されているすべての回答のすべてを試しました。ほぼ24時間前に)応答がありません。

追加情報

http://[URL]:4433/projects/socketに移動すると、「WebSocket Available」が生成されます。ここで、URLは使用したいものであり、AWSが提供するパブリックDNSです。

netstat -pluntを実行すると、次のことがわかります。

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                :::*                                -

AWSのwebsocketで同様の問題を抱えている人はいますか?もしそうなら、どのように問題を解決しましたか?

16
Jay Blanchard

HaskellサーバーとApacheサーバーの間にSSL証明書の不一致がありました。

Haskellサーバーは、インスタンスの新しい証明書に関する情報を使用して再構築する必要がありました。さらに適切なSSLライブラリ(libssl0.9.8 libssl-dev)EC2インスタンスにインストールされていなかったため、Haskellサーバーの再構築中に問題が発生していました。 EC2インスタンスが「空白のキャンバス」であることを知っていると、そのインストールがないことが私のせいになります。

libsslをインストールしたら、新しい証明書を指すHaskellサーバーを再構築できました。証明書が「一致」すると、websocketの問題はなくなりました。

繰り返しになりますが、私たちの状況は独特です。 Apacheサーバー(ポート80と443)とHaskellサーバー(ポート8080と4433)があり、これらは互いに通信して、websocketでpub-sub操作を実行します。 2台のサーバー間の証明書の不一致(どのタイプでもかまいませんが、複数のApacheインスタンスである可能性があります)がSSL警告を引き起こしました。 SSLからの警告は、websocketを確立または維持しようとする試みを破棄します(したがって、ハンドシェイクがキャンセルされたというメッセージです)。

別のStackOverflowポスト は、このプロセス中に非常に役立ついくつかの手がかりを提供しました。より具体的には、この警告-

問題の鍵はこれです:SSL証明書がなんらかの警告を引き起こす場合、wss:// WebSocket接続はすぐに失敗します、そしてこれを検出する標準的な方法はありません。

19
Jay Blanchard