web-dev-qa-db-fra.com

Sécurité Websocket

Je cherche à implémenter des applications Web (angulaires) et iPhone à l'aide de WebSockets pour communiquer avec notre serveur. Dans le passé, en utilisant des requêtes HTTP, nous avons utilisé des hachages en utilisant les données de requête, l'URL, l'horodatage, etc. pour authentifier et sécuriser les requêtes.

Pour autant que je sache, nous ne pouvons pas envoyer d'en-têtes avec des demandes WebSockets, donc je me demande comment je peux sécuriser chaque demande.

Quelqu'un a-t-il des idées ou des bonnes pratiques?

23
John Doe

La communication sécurisée avec le serveur comprend l'authentification des deux parties l'une à l'autre. Si vous devez canaliser différents utilisateurs avec des informations d'authentification différentes via un canal de communication (ce qui est une idée rare de nos jours), vous aurez besoin d'une authentification distincte. Sinon, il vous suffit de trouver un schéma de distribution de clés (pour que vos applications connaissent les clés publiques de votre serveur et que votre serveur dispose d'un protocole d'acquittement des clés publiques des clients, il existe de nombreux modèles pour cela).

Pour ce faire, il existe un gradient de choix un peu plus large que SSL ou votre propre crypto (essayez d'éviter d'écrire votre propre crypto à tout prix).

Pour la partie de la pile du serveur Web au navigateur, SSL est votre seul choix, mais il ne doit pas être considéré comme une bonne mesure de sécurité, chaque année se déroule de plus en plus de vulnérabilités, de cas de dégradation de chiffrement et de problèmes de confiance. Il transporte 20 ans de bagages de mauvaises décisions techniques et de solutions urgentes, donc si vous pouvez obtenir quelque chose de mieux, cela vaut la peine. Pourtant, c'est beaucoup mieux que rien pour les sites Web réguliers.

Dans votre application mobile, vous pouvez facilement utiliser l'une des nombreuses bibliothèques cryptographiques fournissant une messagerie de session sécurisée avec un serveur avec des garanties de sécurité considérablement plus élevées, sans dépendance:

  • https://github.com/mochtu/libsodium-ios , libsodium-ios , un wrapper ios pour NaCl, un des meilleures bibliothèques cryptographiques modernes, qui a beaucoup de nouvelles implémentations de la cryptographie ECC, est très appréciée dans les cercles universitaires et écrite par un fou désireux d'avoir les meilleures performances en toutes circonstances (en bref: je l'adore :)).

  • Themis , un projet dont je suis un contributeur, nous avons une version iOS très conviviale d'ObjC de notre bibliothèque, et un tutoriel pratique pour faire du trafic sécurisé sur websockets dans iOS: https://www.cossacklabs.com/building-secure-chat

4
Eugene

Pour sécuriser vos messages, utilisez WebSockets sur SSL/TLS (wss: // au lieu de ws: //). Ne lancez pas votre propre crypto.

Concernant l'authentification. La grande différence entre HTTP et WebSockets est que HTTP est un protocole sans état et que WebSockets ne l'est pas.

Avec HTTP, vous devez envoyer des en-têtes (cookies, jetons, peu importe) avec chaque demande. Avec WebSockets, vous établissez une connexion. Dans les premières interactions, vous pouvez authentifier le client et pour le reste de la connexion, vous savez que le client est authentifié.

Les employés d'Heroku ont décrit un modèle selon lequel le client s'authentifie à l'aide de HTTP, obtient un ticket puis envoie ce ticket comme premier message via la connexion WebSocket. Voir https://devcenter.heroku.com/articles/websocket-security

16
Pieter Herroelen

Je suis d'accord avec la connexion SSL/TLS wss: //. Utilisez toujours du trafic chiffré. Il existe plusieurs façons d'implémenter une authentification. Voir ici: http://simplyautomationized.blogspot.com/2015/09/5-ways-to-secure-websocket-rpi.html

La plupart des exemples utilisent python ou nodejs et sont dirigés pour le Raspberry Pi mais les concepts généraux sont de bonnes idées à considérer. Il y a des liens dans la publication vers une bibliothèque d'aide SocketRocket qui vous permet d'insérer authentification dans l'en-tête d'authentification (SocketShuttle).

3
Entrabiter