J'utilise GlassFish Server 4.1/Java EE 7. Dans mon fichier web.xml, j'ai mentionné les contraintes de sécurité suivantes.
<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>
Et la même chose pour les autres autorités.
Puisque transport-guarantee
est défini sur CONFIDENTIAL
, pages Web qui correspondent au modèle d'URL spécifié /admin_side/*
exécuter sur un canal sécurisé (HTTPS
).
Lors de l'utilisation de WebSockets comme suit (JavaScript),
var ws = new WebSocket("ws://localhost:8181/Context/Push");
il ne parvient pas à établir une poignée de main initiale. Le navigateur affiche l'avertissement suivant sur la console du navigateur.
[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.
Quand le <user-data-constraint>
la section de web.xml est entièrement supprimée, les pages Web s'exécutent sur HTTP
. Après cela, changer,
var ws = new WebSocket("ws://localhost:8181/Context/Push");
à
var ws = new WebSocket("ws://localhost:8080/Context/Push");
fonctionne bien.
Que pourrait-on faire pour que les WebSockets fonctionnent sur un canal sécurisé?
Essayez avec wss://
, qui indique que vous souhaitez une connexion Websocket sécurisée. Le navigateur vous empêchera de créer des connexions non sécurisées à partir de pages sécurisées, car il comprend que puisque vous avez demandé la page avec https://
, il existe une exigence de sécurité de transport.
Si votre serveur WebSocket fonctionne avec votre serveur Web, il utilisera probablement le même certificat de sécurité et vous n'aurez rien à faire. Si cela ne fonctionne pas, consultez la documentation de votre serveur WebSocket pour savoir comment ajouter des certificats et activer wss://
.