web-dev-qa-db-fra.com

SecurityError non interceptée: échec de construction de «WebSocket»: une connexion WebSocket non sécurisée ne peut pas être établie à partir d'une page chargée via HTTPS

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é?

12
Tiny

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://.

18
vtortola