web-dev-qa-db-ja.com

wss://(SSL / TLS上のWebSockets)接続がエラーなしですぐに切断されるのはなぜですか?

同じ問題を実行している他の誰かのためにこれを投稿します。

私は、stanza.ioを使用してXMPPサーバー(私の場合はProsody)に接続するブラウザークライアントで作業していました。デフォルトではwss://接続を使用していました。開発中のある時点で、私のクライアントはまったく接続に失敗しました-どんな種類の有用なエラー情報も提供せずに、すぐに静かに切断します。

エラーログ、エラーコード、確認ダイアログまたはバー、何が問題であるかの兆候はありませんでした。

23
Sven Slootweg

数時間のデバッグの後、私は最終的に問題を見つけました。 XMPPサーバーの構成をいじっていたため、XMPPdのSSL証明書を再生成しました。私は自己署名証明書を使用していたため、これによりSSLエラーが発生しました。以前に同じURIをHTTPS経由でアクセスしたことがあるため、古い自己署名証明書を既に手動で承認していましたが、SSL証明書の再生成後は明らかに承認が無効になりました。

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

上記のように、この問題が発生していることを検出する標準化された方法はないようです単独で解決しましょう。私が見つけたこの問題の最良の解決策は次のとおりです。

  1. ログイン確認(XMPP固有)を受信する前にWebSocketが切断する場合は、非SSLポートへのプレーンテキストws://SSLなし)接続を試行してください。
  2. 平文接続が成功した場合、これはサーバーが稼働していることを意味します。したがって、問題はSSL証明書にあります。 (プレーンテキスト接続も失敗した場合、サーバーは単に利用できません。)
  3. ユーザーにエラーを表示します。これは、SSLの問題があったこと、および証明書を手動で承認する方法の説明とともに確認する必要があることを示します。
  4. target="_blank" URLへのwss://リンクを提供しますが、プロトコルをhttps://に置き換えます。これはProsody固有のものかもしれませんが、そのURLにアクセスすると、SSL警告ページが表示されます。 Prosodyは「It works!」で始まるテキストを表示します証明書を承認した後-サーバー側がカスタムアプリケーションである場合、「問題が解決されました。このタブを今すぐ閉じることができます」というメッセージを表示する必要があります。
  5. バックグラウンドでは、メインアプリケーションで、数秒ごとにwss://で再接続を試行し続けます。接続が成功すると、これはユーザーが証明書を承認したことを意味します。エラーを非表示/削除し、通常の接続/ログインプロセスを続行します。

UXに関してはスムーズなプロセスとはほど遠いですが、私が見つけた最もスムーズなアプローチです。エラーページをiframeすることはできません(これは私の最初のアイデアの1つでした)-Chromeはロードをまったく拒否し、Firefoxは[例外の追加]ボタンを非表示にします。 d他のブラウザが同様の動作をすることを想像してください。

37
Sven Slootweg

最新のブラウザは自己署名証明書を好まないことに注意してください。したがって、安全なWebSocket接続がハンドシェイクを終了する前に停止した場合、証明書が受け入れられていないことを意味する可能性があります。問題を解決するために、次のことができます。

  • 中央当局によって署名された証明書を購入する
  • 新しいタブまたはウィンドウでWebSocketのURIのリンクを開き、ブラウザに接続を信頼するように指示するだけです。 WebSocketに戻って、動作するはずです。
2
giuseppe

これは私がやったことであり、うまくいきました:

1- 自己署名証明書の生成

2- この方法でhttps websocketsサーバーを作成

0
SadSeven