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-guarantee
はCONFIDENTIAL
に設定され、指定された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を機能させるにはどうすればよいですか?
安全なWebSocket接続が必要であることを示すwss://
で試してください。 https://
を使用してページを要求したため、トランスポートのセキュリティ要件があることをブラウザが理解しているため、ブラウザは安全なページから安全でない接続を作成することを防ぎます。
WebSocketサーバーを最新のWebサーバーで実行している場合、おそらく同じセキュリティ証明書を使用するため、何もする必要はありません。機能しない場合は、証明書を追加してwss://
を有効にする方法について、WebSocketサーバーのドキュメントを確認してください。