Ajout de la prise en charge SSL pour TCP &UDP code?
Voici ma question.
Droit maintenant, j'ai un serveur Linux application (écrit en C++ gcc) qui communique avec un Windows C++ de l'application client (Visual Studio 9, Qt 4.5.)
Quel est le très façon la plus simple pour ajouter le support de SSL sur les deux côtés afin de sécuriser la communication, sans complètement l'éviscération le protocole existant?
C'est une application VOIP qui utilise une combinaison de UDP et TCP pour d'abord configurer la connexion et n'port de tunnel de trucs, et puis utilise UDP pour les flux de données.
J'ai eu beaucoup de problèmes dans le passé avec la création de la sécurité des certificats à partir de zéro qui ont été nécessaires pour obtenir ce genre de choses à travailler.
De travail existant exemple de code serait l'idéal.
Merci!
OriginalL'auteur Wannabe Tycoon | 2009-07-09
Vous devez vous connecter pour publier un commentaire.
SSL est très complexe, de sorte que vous allez avoir à utiliser une bibliothèque.
Il y a plusieurs options, telles que Keyczar, Botan, cryptlib, etc. Chacun de ces bibliothèques (ou les bibliothèques suggéré par d'autres, telles que coup de pouce.Asio ou OpenSSL) aura un exemple de code pour cela.
Répondre à votre deuxième question (comment intégrer une bibliothèque dans le code existant sans causer trop de douleur): il va dépendre de votre code actuel. Si vous avez déjà des fonctions simples qui font appel à l'Winsock ou de la prise de méthodes pour envoyer/recevoir des
int
s,strings
, etc. ensuite, vous avez juste besoin de réécrire les intestins de ces fonctions. Et, bien sûr, changer le code qui met en place le support pour commencer.D'autre part, si vous appelez le Winsock/prise de fonctions directement, alors vous aurez probablement envie d'écrire des fonctions similaires à la sémantique, mais envoyer les données chiffrées, et de remplacer votre Winsock les appels à ces fonctions.
Toutefois, vous souhaitez peut-être envisager de passer à quelque chose comme Google Protocol Buffers ou Apache Épargne (un.k.un. Facebook Épargne). Google Protocol Buffers documentation dit, "Avant le protocole de tampons, il y a un format pour les demandes et les réponses à main utilisés marshalling/unmarshalling de demandes et de réponses, et qui a soutenu un certain nombre de versions du protocole. En conséquence, certains très laid code. ..."
Vous vous trouvez actuellement dans la main marshalling/unmarshalling phase. Il peut travailler, et en fait un projet sur lequel je travail sur l'utilisation de cette méthode. Mais il est beaucoup plus agréable de quitter que pour une bibliothèque; en particulier d'une bibliothèque qui a déjà donné à penser à mettre à jour le logiciel à l'avenir.
Si vous suivez cette voie, vous allez configurer vos connexions réseau avec une bibliothèque SSL, et puis vous allez pousser votre Épargne/Protocole de la mémoire Tampon de données au cours de ces connexions. C'est tout. Il implique un vaste remaniement, mais vous vous retrouverez avec moins de code à maintenir. Lorsque nous avons lancé le Protocole de Tampons dans la base de code de ce projet je l'ai mentionné, nous avons été en mesure de se débarrasser d'environ 300 lignes de marshalling/demarshalling code.
OriginalL'auteur Max Lybbert
Je recommande d'utiliser GnuTLS sur le client et côté serveur, uniquement pour la connexion TCP. Oubliez les données UDP pour l'instant. Le GnuTLS documentation a exemple de code pour l'écriture à la fois les clients et les serveurs. S'il vous plaît comprendre que, au moins du côté serveur (généralement le TCP répondeur) doit disposer d'un certificat; le côté client peut travailler avec identification anonyme (bien qu'il y est encore un exemple sans certificat de serveur, à l'aide seulement de clés DIFFIE-échange - qui permettent à l'homme-dans-the-middle attaques).
En général, il est probable que vous aurez à comprendre les principes de SSL, peu importe ce que la bibliothèque que vous utilisez. Bibliothèque des solutions de rechange sont OpenSSL (Unix et Windows), et SChannel (uniquement sous Windows).
OriginalL'auteur Martin v. Löwis
Avez-vous essayé le support de SSL dans Coup de pouce.Asio ou ACE? Les deux utilisent OpenSSL sous le capot, et offrent le même genre d'abstractions pour TCP, UDP et SSL. Exemple de code est disponible dans les Boost.Asio et ACE distributions.
Une chose que vous pouvez avoir besoin de garder à l'esprit que le protocole SSL est document axé sur la place du flux orienté (TCP et UDP). Cela peut affecter la façon dont vous multiplex événements puisque vous devez, par exemple, de lire l'intégralité de l'enregistrement SSL avant d'appeler une opération de lecture complète.
OriginalL'auteur Void
Pour aider à gérer cela sans apporter de modifications à l'application yo peut vouloir regarder le stunnel projet (http://www.stunnel.org/). Je ne pense pas qu'il va traiter de l'UDP pour vous si.
OriginalL'auteur user104034
La yaSSL et CyaSSL intégré SSL/TLS bibliothèques ont bien travaillé pour moi dans le passé. Destinées à des systèmes embarqués, ils sont optimisés pour la vitesse et de la taille. yaSSL est écrit en C++ et CyaSSL est écrit en C. En comparaison, CyaSSL peut être jusqu'à 20 fois plus petite que OpenSSL.
À la fois le soutien de la plupart des normes actuelles de l'industrie (jusqu'à TLS 1.2), offre quelques fonctionnalités intéressantes telles que les chiffrements de flux, et sont à double sous licence GPLv2 et une licence commerciale (si vous avez besoin d'une assistance commerciale).
Ils ont un SSL tutoriel qui touche à l'ajout de CyaSSL dans votre pré-code existant: http://www.yassl.com/yaSSL/Docs-cyassl-manual-11-ssl-tutorial.html
Page De Produit: http://yassl.com/yaSSL/Products.html
Ce qui concerne,
Chris
Triste à entendre. J'ai réalisé qu'il avait été un long temps depuis votre message, mais je pensais que je serais au moins post pour référence future souci.
OriginalL'auteur Chrisc