WebSocket avec SSL

117

Est-il possible d'avoir des WebSockets avec HTTPS?

Lors du passage à HTTPS, mon WebSocket renvoie une erreur de sécurité et fonctionne parfaitement avec HTTP standard.

Ci-dessous, un extrait;

socket = new WebSocket("ws://my_www:1235"); 
Eric
la source
mon mauvais, j'ai réalisé que le serveur de socket AIR que j'utilise n'est pas sécurisé, je dois réécrire pour utiliser flash.net.SecureSocket ...
Eric

Réponses:

172

La connexion WebSocket commence sa vie par une négociation HTTP ou HTTPS. Lorsque la page est accessible via HTTP, vous pouvez utiliser WS ou WSS (WebSocket secure: WS over TLS). Cependant, lorsque votre page est chargée via HTTPS, vous ne pouvez utiliser que WSS - les navigateurs ne permettent pas de «rétrograder» la sécurité.

Peter Moskovits
la source
c'est ce que j'ai mais j'ai réalisé que le serveur de socket AIR que j'utilise n'est pas sécurisé, je dois réécrire pour utiliser flash.net.SecureSocket ...
Eric
Flash a aussi de sérieux problèmes ... Construisez-vous un serveur WebSocket (si oui, pourquoi) ou construisez-vous une application?
Peter Moskovits
1
J'ai un serveur de socket AIR fonctionnant oui.
Eric
Alors, comment sélectionner WSS si la page n'est pas chargée avec HTTP?
anatoly techtonik
30

Vous ne pouvez pas utiliser WebSockets sur HTTPS, mais vous pouvez utiliser WebSockets sur TLS (HTTPS est HTTP sur TLS). Utilisez simplement "wss: //" dans l'URI.

Je pense que la version récente de Firefox ne vous permettra pas d'utiliser des WebSockets non-TLS à partir d'une page HTTPS, mais l'inverse ne devrait pas être un problème.

Kanaka
la source
Alors, quelle est la solution? J'ai un serveur WS fonctionnant sur http maintenant, j'ai acheté un SSL et le navigateur ne me permet plus de me connecter avec WS. J'ai transformé WS en WSS: // et maintenant il ne se connecte pas avec WebSocket
muaaz
@muaaz votre serveur WebSocket doit fonctionner en mode WSS et de préférence chargé avec les mêmes certificats / clés SSL que votre serveur Web qui dessert vos pages Web d'origine qui tentent de se connecter au serveur Websocket.
kanaka le
4
Je vous remercie. btw, je viens de le résoudre en proxy (en utilisant apache) la demande de wss://à ws://. Donc, j'utilise wss://ws.domain.comet apache j'applique le proxy dessus et redirige la demande là où le serveur WS est en cours d'exécution. par exemple: ws://10.12.23.45:5641/server.php. et je sais que c'est une très mauvaise solution - bien que cela fonctionne pour moi. J'apprécierais votre aide si vous me guidez à travers la configuration d'Apache. par exemple: où mettre le .certetc. merci!
muaaz le
@muaaz désolé, je ne connais pas la configuration d'Apache à part la googler moi-même.
kanaka le
21

1 mise en garde supplémentaire (en plus de la réponse de kanaka / peter): si vous utilisez WSS et que le certificat de serveur n'est pas acceptable pour le navigateur, vous ne pouvez pas obtenir de dialogue rendu par le navigateur (comme cela se produit pour les pages Web). Ceci est dû au fait que WebSockets est traité comme une soi-disant «sous-ressource» et que les dialogues d'acceptation de certificat / d'exception de sécurité / quels que soient les dialogues ne sont pas rendus pour les sous-ressources.

oberstet
la source
Même s'il s'agit du même certifcat que celui utilisé pour HTTPS?
vekah
1
Qu'entendez-vous par "dialogue rendu par le navigateur"? Comme alert()?
Ivan Perevezentsev
2
Dialogues qui proviennent nativement du navigateur (pas d'une page). Comme "ce certificat n'est pas valide, voulez-vous continuer?"
oberstet le
alors y a-t-il un moyen de surmonter cela? si j'utilise un certificat auto-signé, puis-je toujours utiliser websocket?
OhadR