web-dev-qa-db-ja.com

キャッチされていないSecurityError:「WebSocket」の構築に失敗しました:安全でないWebSocket接続がHTTPS経由でロードされたページから開始されない可能性があります

GlassFish Server 4.1/Java EE 7を使用しています。web.xmlファイルで、次のセキュリティ制約について言及しました。

<security-constraint>
    <display-name>UserConstraint</display-name>
    <web-resource-collection>
        <web-resource-name>Provide a Name</web-resource-name>
        <description/>
        <url-pattern>/admin_side/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>ROLE_ADMIN</role-name>
    </auth-constraint>
    <user-data-constraint>
        <description/>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

他の当局についても同じです。

transport-guaranteeCONFIDENTIALに設定され、指定されたURLパターンに一致するWebページ/admin_side/*安全なチャネル(HTTPS)で実行します。

次のようにWebSocketを使用しているとき(JavaScript)、

var ws = new WebSocket("ws://localhost:8181/Context/Push");

最初のハンドシェイクを確立できません。ブラウザのブラウザコンソールに次の警告が表示されます。

[blocked] The page at 'https://localhost:8181/Context/admin_side/Category' was loaded over HTTPS, but ran insecure content from 'ws://localhost:8080/Context/Push': this content should also be loaded over HTTPS.

Uncaught SecurityError: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.

<user-data-constraint> web.xmlのセクションは完全に削除され、WebページはHTTPで実行されます。その後、変化し、

var ws = new WebSocket("ws://localhost:8181/Context/Push");

var ws = new WebSocket("ws://localhost:8080/Context/Push");

正常に動作します。

安全なチャネルでWebSocketを機能させるにはどうすればよいですか?

12
Tiny

安全なWebSocket接続が必要であることを示すwss://で試してください。 https://を使用してページを要求したため、トランスポートのセキュリティ要件があることをブラウザが理解しているため、ブラウザは安全なページから安全でない接続を作成することを防ぎます。

WebSocketサーバーを最新のWebサーバーで実行している場合、おそらく同じセキュリティ証明書を使用するため、何もする必要はありません。機能しない場合は、証明書を追加してwss://を有効にする方法について、WebSocketサーバーのドキュメントを確認してください。

18
vtortola