web-dev-qa-db-ja.com

WebSockets:ELBを介したクライアントからAmazon AWSEC2インスタンスへのwss

ELBを介してAmazonAWS EC2インスタンスでGlassFishが提供するWebSocketにSSL経由で接続するにはどうすればよいですか?

WebSocketの実装として、GlassFish 4.1b13プレリリースのTyrus1.8.1を使用しています。

ポート8080は保護されておらず、ポート8181はSSLで保護されています。

  • ELB DNS名:elb.xyz.com
  • EC2 DNS名:ec2.xyz.com
  • websocketパス:/ web/socket

Wsとwssの両方を使用して、EC2インスタンスに直接接続しました(ELBをバイパスしました)。つまり、次の両方のURLが機能します。

  • ws://ec2.xyz.com:8080/web/socket
  • wss://ec2.xyz.com:8181/web/socket

Tcp 80> tcp 8080リスナーを使用して、ELB上でws(非SSL)を正常に使用しました。つまり、次のURLが機能します。

  • ws://elb.xyz.com:80/web/socket

しかし、ELBを介してwssを使用する方法を見つけることができませんでした。

私は多くのことを試みました。

私のELBを介してwssを機能させる最も可能性の高い方法は、プロキシプロトコルを有効にしてELB上にtcp 8181> tcp 8181リスナーを作成し、次のURLを使用することだと思います。

  • wss://elb.xyz.com:8181/web/socket

残念ながら、それは機能しません。 Glassfishでプロキシプロトコルを有効にする必要があるかもしれませんが、その方法を見つけることができませんでした(または、それが可能かどうか、またはwssがELBを処理する必要があるかどうか)。

別のオプションは、何らかの方法でwsまたはwssをELBで終了するssl接続上で実行し、ssl> tcp 8080リスナーを使用して、Glassfishに対して保護されないままにすることです。それは私にとってもうまくいきませんでしたが、おそらくいくつかの設定が間違っていました。

誰かが私の前述の2つの試験に変更を加えていますか?または誰か他の提案がありますか?

ありがとう。

16
XDR

私は同様のセットアップを行い、元々ELBリスナーを次のように構成しました。

  • HTTP 80 HTTP 80
  • HTTPS 443 HTTPS 443

これはWebサイト自体では正常に機能しましたが、WebSocket接続は失敗しました。リスナーでは、SSLとは対照的に、すべての安全なTCP接続を許可して、wssも通過できるようにする必要があります。

  • HTTP 80 HTTP 80
  • SSL(セキュアTCP)443 SSL(セキュアTCP)443

ELBのアイドルタイムアウトを上げることもお勧めします。

17
guillaumepiot

最近、ブラウザとEC2Node.jsインスタンスの間でwssを有効にしました。考慮すべきことが2つありました。

  • [ELBリスナー]タブで、ロードバランサープロトコルとしてSSLを使用するwssポートの行を追加します。
  • [ELBの説明]タブで、より高いアイドルタイムアウト(接続設定)を設定します。これはデフォルトで60秒です。 ELBは1分後にWebSocket接続を切断し、アイドルタイムアウトを3600(最大値)に設定すると、はるかに長い通信が可能になります。

タイムアウトがまだあるので、それは明らかに究極の解決策ではありませんが、私たちが通常行うことにはおそらく1時間で十分です。

この助けを願っています

8
peveuve