Question:
Comment remplacer SSL / TLS?
Tloz
2015-12-16 20:28:34 UTC
view on stackexchange narkive permalink

Je dois créer un site Web pour une ONG (organisation non gouvernementale), et ils ont les options minimales de leur fournisseur, donc ils ne peuvent pas avoir SSL / TLS (à peine seulement HTML / PHP / MySQL / JS)

Les données qui vont de et vers le serveur ne sont pas très sensibles, mais je ne veux pas que leurs mots de passe, nom et adresse soient envoyés clairement sur le Web.

J'ai pensé sur le chiffrement des données à l'intérieur du JavaScript qui appelle les fonctions de l'API avec RSA (je ne suis pas un expert, mais cette lib semble assez efficace), mais j'ai rouge un article qui conseille fortement de ne pas utiliser JavaScript pour la crypto (je suis français et peut-être que je n'ai pas tout compris, mais j'ai compris le point principal).

Alors, que dois-je utiliser pour chiffrer les données sur le réseau? Si JS n'est pas vraiment une mauvaise idée, que puis-je faire pour assurer une sécurité maximale avec la technologie que je peux utiliser sur ce serveur (encore une fois, pas de HTTPS, malheureusement), à part importer la lib sur mon serveur et ne pas compter lors de son importation depuis un autre serveur?

L'article est correct; il n'y a tout simplement pas de bon moyen d'implémenter le chiffrement entre un serveur Web et un client sans utiliser SSL / TLS. Sans infrastructure à clé publique pour vérifier l'identité du serveur, les attaques [MITM] (https://en.wikipedia.org/wiki/Man-in-the-middle_attack) seraient très faciles. De plus, n'importe qui peut simplement supprimer / modifier le javascript en transit.
Vous pourriez être intéressé par le programme Let'sEncrypt: https://letsencrypt.org/. Ce n'est peut-être pas la meilleure option, mais c'est mieux que rien.
On dirait qu'ils ont besoin d'un nouveau fournisseur ...
Quel est l'intérêt de crypter les données lorsque le code Javascript qui effectue le cryptage est envoyé en clair et non signé? Les pirates vont mettre en place un faux serveur qui aura votre interface, mais aucun de votre code Javascript protecteur, et consigner simplement les mots de passe.
Fournir un gros client SIGNÉ pour l'interpénétration avec le service. Le service n'est pas accessible via un navigateur Web.
@Ohnana, Non, Let's Encrypt est simplement un fournisseur de certificats SSL / TLS gratuits. Cela n'aide pas si le fournisseur utilisé n'autorise pas SSL / TLS.
@MartijnHeemels J'y ai pensé, mais j'ai également considéré que le coût pouvait être un facteur («options minimales du fournisseur»), étant donné que les ONG ne sont pas connues pour leurs grosses sommes d'argent.
@Ohnana Ah, je vois. Pour l'aider à faire une analyse de rentabilisation pour une mise à niveau du plan d'hébergement. Bien que cela puisse aider, des certificats gratuits existaient avant Let's Encrypt, par exemple de StartSSL.com et les certificats payants commencent à partir de quelques $ / an. Moins cher qu'un mois d'hébergement bon marché.
Étape 1: confirmez que le fournisseur * vraiment * n'autorise aucun TLS / SSL sur son plan "de base". Ce serait épouvantable s'ils ne permettaient pas cela lorsqu'ils vous donnent un magasin de données (et également digne de honte publique). Vous devrez probablement acheter un certificat, mais refuser la possibilité de le configurer est vraiment absurde.
@jpmc26 S'ils ne prennent pas en charge SNI et s'ils ne prennent pas en charge IPv6, ils auront besoin d'une adresse IPv4 distincte par domaine. De nos jours, les options d'hébergement les moins chères sont en fait moins chères que le coût de location d'une seule adresse IPv4. De ce point de vue, il est donc logique de ne pas prendre en charge le chiffrement sur le plan le moins cher. Bien sûr, ce qu'ils doivent faire est de prendre en charge à la fois SNI et IPv6 afin qu'ils puissent fournir TLS sans avoir une adresse IPv4 par domaine.
@jpmc26 Je ne vois rien d'épouvantable à propos de la désactivation des fonctionnalités pour les plans ** gratuits **. L'intention de la plupart des plans gratuits est de vous accrocher juste assez pour passer à un plan payant. Vous ne devriez * pas * vous attendre à ce que le plan gratuit soit suffisant pour tout hébergement sérieux. L'hébergement Web bon marché est de l'ordre de 10 $ / mois - quel est exactement le peu d'argent de cette organisation?
De nombreux fournisseurs d'hébergement, même s'ils n'offrent pas de fonctionnalités SSL individuelles, ont des certificats partagés qui peuvent être utilisés par n'importe quel compte utilisateur. Donc, au lieu de https://www.mydomain.com/login.html, vous utiliseriez quelque chose comme https://hostingdomain.com/~mydomain/login.html (ces pseudo liens ont https devant eux, cela ne fait tout simplement pas) t afficher sur la page) Ce n'est pas aussi soigné que d'avoir votre propre certificat, mais cela offre une option SSL / TLS appropriée sans aucun coût supplémentaire. Il vaudrait la peine de vérifier si cette option est disponible.
@Mark_1 Je vais certainement vérifier cela. Je pense qu'ils proposent "SSL mutualisé", pourrait être un indice
Parlons-nous d'un serveur Web qui servira des pages Web? Ou un serveur pour autre chose? (Peut-être un serveur Node.js pour un jeu de bureau)
Cela vaut la peine de savoir si quelqu'un fera don d'hébergement. Si vous ne dirigez pas une entreprise à but lucratif, certains fournisseurs peuvent être assez généreux.
Une idée étrange: considérez une situation où PHP ne gère que des données et tout le reste est des fichiers statiques. Ces fichiers statiques ne pourraient-ils pas être hébergés sur un serveur statique HTTPS (GitHub Pages + CloudFlare, par exemple), fournissant une authentification et empêchant toute possibilité MITM, et une communication avec le backend PHP non sécurisé crypté avec JavaScript? Le blocage HTTPS vers HTTP XHR "plus sûr" peut être contourné avec GD et ``.
Vous pouvez envisager d'utiliser Cloudflare, car ils fournissent des certificats gratuits. Bien sûr, cela ne protégera que `client -> CDN` et non` CDN -> votre serveur`, mais cela devrait être suffisant contre la plupart des situations MITM.
Si le service d'hébergement de l'opération fournit un certificat partagé, vous pouvez utiliser Cloudflare (commentaire @Marcelo's ci-dessus) pour mettre fin à la connexion SSL afin que vous puissiez toujours utiliser le domaine de l'ONG tout en gardant la sécurité de bout en bout. Voir https://www.cloudflare.com/ssl/
Bien que le PO n'indique pas qu'ils résident dans l'Union européenne, leur nationalité est déclarée comme française et si eux ou (probablement d'une plus grande importance) l'ONG sont situés dans l'Union européenne, ils ont l'obligation légale de les protéger. toute information relative à une personne physique identifiée ou identifiable "en vertu de la directive 95/46 / CE du Parlement européen. Au Royaume-Uni, par exemple, cela a transposé la législation nationale par le biais du Data Protection Act 1998 (je ne suis pas sûr de la législation en France). Le nom et l'adresse sont certainement des informations personnelles et doivent être protégés.
@Tloz Si l'ONG ne peut ou ne veut pas mettre en œuvre une sécurité appropriée telle que SSL, vous devez lui demander d'obtenir des conseils juridiques appropriés, le faire par écrit et en conserver une copie pour vos propres dossiers.
Sept réponses:
Thomas Pornin
2015-12-16 21:11:05 UTC
view on stackexchange narkive permalink

Pas de SSL, pas de sécurité. Les choses dans le monde réel sont rarement simples, mais ici c'est le cas. Cela se voit facilement comme suit: tout ce que vous faites en Javascript, se fera en Javascript envoyé par le serveur . Tout attaquant qui est en mesure de regarder les données peut également les modifier à volonté (par exemple, le moyen le plus simple d'espionner le WiFi est d'exécuter votre propre faux point d'accès, puis vous pouvez naturellement modifier toutes les données au fur et à mesure) ; ainsi, un tel attaquant peut simplement supprimer ou modifier la solution Javascript que vous pourriez proposer et la désactiver. Ou ajoutez simplement un crochet pour également envoyer le mot de passe en clair comme paramètre supplémentaire.

Maintenant, même si vous pouviez obtenir du «Javascript sûr» sur le navigateur client, vous rencontreriez alors tous les problèmes liés à la crypto Javascript, et qui sont détaillés dans l'article auquel vous créez un lien. Mais ce n'est qu'une considération secondaire, par rapport à la faille fondamentale expliquée ci-dessus: sans SSL, vous ne pouvez pas vous assurer que ce qui s'exécute sur le navigateur client est votre code.

Essayer de gérer le mot de passe en toute sécurité sur un site Web non SSL revient à essayer d'effectuer une chirurgie cérébrale en toute sécurité avec seulement une cuillère à café et un pied de biche rouillé. Ne fais pas ça. S'il y a des données sensibles qui circulent vers le site Web (par exemple des noms et des adresses), vous DEVEZ appliquer des mécanismes de protection raisonnables. Si les données ne sont pas sensibles, pourquoi auriez-vous besoin de mots de passe?

Les commentaires ne sont pas destinés à une discussion approfondie; cette conversation a été [déplacée vers le chat] (http://chat.stackexchange.com/rooms/33179/discussion-on-answer-by-thomas-pornin-how-to-replace-ssl-tls).
symcbean
2015-12-16 21:16:07 UTC
view on stackexchange narkive permalink

À mon humble avis, le générateur de nombres aléatoires est le moindre de vos soucis ici. Puisque le code pour invoquer l'enceyption est envoyé en clair, il est trivial pour quelqu'un de MITM l'interaction.

Si le service nécessite le niveau de sécurité fourni par le cryptage et est fourni par un site Web, alors il DOIT utiliser HTTPS (et idéalement tous les éléments de sécurité associés comme les cookies secure + httponly et HSTS).

Le seul moyen de contourner ce problème serait d'écrire une application HTML5 (où le le code est rarement téléchargé) - mais même cela présente des inconvénients importants.

Oui, mais une application HTML5 ne serait pas sécurisée car il n'y aurait pas de bon moyen de s'authentifier, c'est-à-dire que vous téléchargez l'application à partir du bon serveur et qu'elle n'est pas modifiée.
Oui, comme je l'ai dit, il présente des inconvénients importants et se situe LONGTEMPS en deçà d'un service HTTPS correctement implémenté, mais c'est légèrement mieux que d'essayer de le faire via HTTP. Il existe de très bonnes façons de s'authentifier (mais sans protection de session). Vous semblez être à l'aise avec l'authentification ici sur Stackexchange, Martijn: P
Il serait sans doute possible d'héberger l'application HTML5 ailleurs (sur HTTPS) et d'exécuter CORS AJAX crypté sur le site - mais cela est semé d'embûches, même pour un expert. Vous pourriez vous mettre en orbite si vous aviez une échelle suffisamment grande - mais ce n'est pas un moyen judicieux de résoudre le problème.
Bruno
2015-12-17 13:04:29 UTC
view on stackexchange narkive permalink

La meilleure solution, comme cela a été dit, est d'obtenir un véritable plan d'hébergement Web qui autorise https. Cela ne devrait pas être trop cher, en fait il devrait même être possible de trouver un fournisseur gratuit pour fournir cela.

À défaut, quel est votre cas d'utilisation? Il semble que vous ayez à l'esprit un groupe d'utilisateurs défini pour votre site Web. Si tel est le cas et que vous n'offrez pas simplement un service de notification d'événements basé sur un abonnement à des personnes aléatoires sur Internet, envisagez de fournir la base d'une connexion `` sécurisée '' sur un canal différent.

Cela se produit pour moi, qu'obtenir le code sur leur machine par une autre source fiable (poster des CD par courrier postal et les informer par e-mail, simplement envoyer le logiciel en pièce jointe à un e-mail signé numériquement, etc.) vous permet de précharger le logiciel avec une clé publique cryptographique.

Vous pouvez alors négocier une connexion sécurisée via une méthode de connexion non sécurisée (telle que http) car le code déterminant si le serveur a déchiffré de manière satisfaisante les détails cryptés avec sa clé publique vit le client. Un flux de données d'application http "en clair" est le résultat, avec la ride que les données d'application elles-mêmes sont cryptées.

C'est beaucoup de problèmes et une méthode non standard. Vous rencontrez des problèmes de mise en œuvre car peu de personnes l'auront essayé pour vous conseiller, et de sécurité puisque peu de personnes en ont revu sa fiabilité *.

Le canal alternatif peut lui-même avoir des problèmes de sécurité. Le courrier pourrait-il être intercepté? Les fraudeurs pourraient-ils se faire passer pour votre organisation et envoyer leur propre version «sécurisée» de votre logiciel? Vos utilisateurs sont-ils suffisamment avertis pour vérifier les signatures numériques des e-mails que vous envoyez? Ce sont toutes des préoccupations que vous devrez considérer et accepter comme risques ou tenter d'atténuer avec de nouvelles solutions, car vous avez moins de conseils non seulement sur la façon de mettre en œuvre, mais même sur les questions que vous devez poser (vous devrez plus que ces trois!).

Lorsque vous parlez à la direction de l'ONG, pensez à décrire la situation en ces termes:

  1. Cette dernière méthode comporte des risques importants et finira par leur coûter plus de temps à mettre en œuvre que cela ne le fera simplement payer pour l'hébergement - le programme doit être mis à jour, surtout si le serveur (ou la paire de clés du serveur) change, et continuellement distribué aux nouveaux utilisateurs après le déploiement initial.
  2. Ne rien faire du tout et utiliser un mot de passe http avec des adresses et des noms (et potentiellement des adresses e-mail) pourrait être un désastre de relations publiques en cas de fuite d'informations (et ce sera le cas), un risque important. Cela est aggravé par le fait que les gens réutilisent les mots de passe et que votre mauvaise pratique pourrait être liée à des violations ultérieures.
  3. Vous avez ainsi réfléchi à la situation et vous n'allez pas simplement suggérer la solution décrite dans étape 4 parce que «tout le monde le fait» (bien que, dans le cas où tout le monde le fait parce que c'est la meilleure pratique, ce n'est pas une mauvaise chose). Être en mesure de proposer la solution alternative (si compliquée et excessive) décrite dans les étapes 1 & 2 est la preuve de cette diligence raisonnable.
  4. Sur cette base, l'hébergement https avec un coût continu faible (ou nul) est approche à la fois la moins coûteuse ET la moins risquée.

* Jonathan Gray explique pourquoi vous rencontrerez des problèmes de codage d'un système sécurisé dans sa réponse, regardez la section commençant par "TLS est aussi un système beaucoup plus intrinsèque"

Si vous êtes au point où vous envisagez de passer par la difficulté de pré-distribuer les clés de cryptage, je pense que * beaucoup * une meilleure idée que de lancer votre propre crypto JS serait de créer votre propre autorité de certification SSL ( CA) et distribuez le certificat CA aux clients. Ensuite, vous aurez tous les avantages d'un SSL approprié, sans avoir à payer pour un certificat, mais au prix de la pré-distribution et du fardeau de gérer correctement l'AC.
Bon point, et en supposant que la raison pour laquelle il est prétendu que https ne peut pas être utilisé sur le fournisseur n'est que des problèmes d'approvisionnement de certificat, ce sera beaucoup plus simple. Même si le fournisseur bloque carrément le port 443, il n'y a aucune raison pour laquelle https://www.example.com:80 ne fonctionnera pas (à moins qu'il ne fasse l'inspection des paquets). Je me demande s'il existe des sites soutenus par une autorité de certification de grande renommée où vous pouvez héberger un certificat racine avec des vérifications autour desquelles vous pourriez diriger vos clients afin qu'ils puissent télécharger la clé publique? Probablement pas, il concurrencerait leur modèle commercial de vente de certificats.
ARau
2015-12-16 21:44:44 UTC
view on stackexchange narkive permalink

Commencez par remplacer votre hôte.

Obtenir des certificats SSL est plus facile que jamais grâce aux autorités de certification gratuites. LetsEncrypt, par exemple, propose des certificats de validation de domaine SSL / TLS gratuits de manière automatisée à condition que vous soyez propriétaire du nom de domaine. Il y a plus d'explications dans la réponse de StackzOfZtuff sur ses fonctionnalités.

Il y a des instructions sur la façon de le configurer sur leur site communautaire avec des FAQ et un forum d'aide .

Cela ne répond pas à la question puisque son hébergeur ne fournit pas de support SSL / TLS. Que le certificat soit gratuit ou non ne fait aucune différence.
Si son fournisseur ne prend pas en charge TLS / SSL et que c'est pour une ONG, alors en tant que responsables de la sécurité, nous devons l'encourager et l'aider à trouver un fournisseur d'hébergement qui prend en charge les meilleures pratiques de sécurité. Je ne suis pas le seul à avoir suggéré LetsEncrypt sur ce fil. LetsEncrypt est pris en charge par de nombreuses organisations réputées dédiées à la confidentialité et à la sécurité. Nous devons rendre les utilisateurs conscients de cela comme une option qui leur est disponible.
Marqué pour spam, car le demandeur ne demande pas de certificat SSL / TLS, et vous donnez un site Web plutôt louche qui donne des certificats ssl / tsl "gratuits".
@ardaozkal Bien que je convienne que cette réponse ne soit pas particulièrement utile dans ce contexte, Let's Encrypt est loin d'être «loufoque». Il est très connu dans la communauté de la sécurité et est soutenu par Mozilla, Facebook, Cisco et l'Electronic Frontier Foundation, entre autres.
@blownie55 Je suis d'accord sur ce que nous devrions conseiller au PO pour trouver une meilleure solution, comme beaucoup le font, mais Let's Encrypt ne fait rien pour aider à cet égard. Tout certificat SSL bon marché ferait bien l'affaire, ou même un certificat gratuit de StartSSL.com. Le fait que Let's Encrypt soit maintenant disponible et gratuit est très bien mais finalement pas le problème ici. Vous n'êtes en effet pas le seul à l'avoir suggéré. Cela ne vous donne pas raison, cela fait aussi tort à l'autre.
Jonathan Gray
2015-12-16 21:01:29 UTC
view on stackexchange narkive permalink

Le problème avec JS est la génération de nombres aléatoires (qui est vitale pour la sécurité du chiffrement moderne). Il existe des bibliothèques existantes disponibles qui aident à résoudre ce problème, mais vous devez vous assurer que la bibliothèque utilise crypto.getRandomValues ​​ ainsi que la possibilité d'obtenir de l'entropie à partir d'une entrée humaine (telle que l'activité de la souris ou du clavier) . Ceci est particulièrement lourd pour les appareils mobiles, cependant, surtout si l'on considère le fait que le matériel lui-même est moins capable de générer des nombres aléatoires sécurisés.

Je voudrais également ajouter un point supplémentaire sur RSA. Vous ne pouvez chiffrer que de petites quantités de données avec lui, et la quantité de données est relative à la longueur de clé utilisée. Non seulement cela, mais RSA est lent. Si vous avez besoin d'une quantité décente de données ou si vous faites plusieurs demandes au serveur, je vous recommande de chiffrer une clé aléatoire (CSPRNG) avec JS côté client en utilisant la clé publique du serveur et d'utiliser cette clé pour un chiffrement symétrique.

Edit: TLS est aussi un système beaucoup plus intrinsèque qui travaille très dur pour se protéger contre toutes sortes d'attaques. Le seul type d'attaque contre lequel TLS ne protège pas efficacement est une déconnexion forcée. Tout, de l'authentification du serveur à la protection de l'homme du milieu en passant par la protection contre les attaques de relecture, est géré automatiquement par TLS à une couche même pas vue par le programmeur de haut niveau moyen. Dans votre situation, vous indiquez que vous ne pouvez pas utiliser les connexions TLS / (SSL) réelles, ce qui est malheureux. Mais je tiens à préciser que je déconseille vivement toute implémentation personnalisée conçue pour remplacer TLS.

Michael
2015-12-18 01:32:50 UTC
view on stackexchange narkive permalink

Potentiellement en dernier recours, car il ne sera pas aussi bon que le TLS de bout en bout ... mais vous pourriez peut-être mettre quelque chose comme CloudFlare devant pour au moins avez TLS vers le point de terminaison client?

Cela marche. J'ai déjà utilisé [Amazon Cloudfront] (https://aws.amazon.com/cloudfront/) "avec succès" pour contourner les prix de surcharge SSL de Heroku. Mais sachez que cela donne aux utilisateurs un faux sentiment de sécurité, car le trafic entre le point d'entrée et votre serveur n'est pas chiffré.
Une possibilité * théorique * est de configurer CloudFlare / Cloudfront pour fournir les fichiers JavaScript en toute sécurité (via HTTPS) à partir d'un CDN associé plutôt que de votre serveur, et tout le reste de votre serveur en utilisant le cryptage côté client JS. * Pratiquement *, obtenez un espace Web avec SSL, comme mentionné…
rath
2015-12-18 17:26:53 UTC
view on stackexchange narkive permalink

Une autre option est d'écrire un plugin de navigateur, ou un script Tampermonkey (pour réduire les maux de tête multi-plateforme), et d'avoir le code JS pré-livré au navigateur. Je le mentionne uniquement à titre de mesure de dernier recours.

L'inconvénient évident est que vos utilisateurs sont limités à utiliser les ordinateurs qui ont déjà le plugin, ou à devoir le télécharger à nouveau chaque fois qu'ils utilisent un nouvel appareil . Il serait également difficile d'utiliser des appareils mobiles avec.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...