Transformer une simple prise dans un socket SSL
J'ai écrit simple, les programmes en C, qui sont à l'aide de sockets ("client" et "serveur").
(UNIX/Linux utilisation)
Le côté serveur tout simplement crée une socket:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
Et se lie ensuite à sockaddr:
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
Et à l'écoute (et accepte et lit):
listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
read(newsockfd,buffer,255);
Le client crée la socket, puis écrit.
Maintenant, je veux convertir cette connexion simple dans une connexion SSL, le plus simple, le plus idyllique, la plus fantastique et le plus rapide.
J'ai essayé d'ajouter OpenSSL à mon projet, mais je ne peux pas trouver un moyen facile de mettre en œuvre ce que je veux.
- Si vous êtes à la recherche d'une "connexion sécurisée" plutôt que le SSL en particulier, vous pouvez regarder quelque chose comme proxychains.sourceforge.net qui se trouve en dehors de votre application, et de le configurer pour envoyer du trafic sur une connexion SSH. Aussi loin que dans l'application SSL, OpenSSL est assez facile si vous comprenez comment le protocole SSL/TLS est censé fonctionner. Si vous voulez une alternative, essayez yaSSL ou gnuTLS .
- Définir les "easy way". OpenSSl est la norme pour les programmeurs C. Si vous avez de la difficulté avec elle, vous devriez demander à ce sujet.
Vous devez vous connecter pour publier un commentaire.
Il y a plusieurs étapes lors de l'utilisation d'OpenSSL. Vous devez avoir un certificat SSL qui puissent contenir le certificat avec la clé privée assurez-vous de spécifier l'emplacement exact du certificat (cet exemple est à la racine du site). Il y a beaucoup de bons tutoriels là-bas.
Certains inclut:
Vous devez initialiser OpenSSL:
Maintenant, pour la majeure partie de la fonctionnalité. Vous souhaiterez peut-être ajouter une boucle while sur les connexions.
Vous êtes alors en mesure de lire ou d'écrire à l'aide de:
Mise à jour
Le
SSL_CTX_new
doit être appelée avec la méthode TLS qui correspond le mieux à vos besoins afin de soutenir les nouvelles versions de la sécurité, au lieu deSSLv23_server_method()
. Voir:OpenSSL SSL_CTX_new description
if
est mal. Il devrait êtreif (ssl_err <= 0) {
seulement alors c'est une erreur.SSL_accept()
retourne1
en cas de succès,0
sur "contrôlée" échec et-1
sur "l'échec fatal". Voir la page de man.SSL_CTX_set_tmp_dh[_callback]()
n'est pas appelé. Juste découvert la manière dure que aNULL les algorithmes ne fonctionnent pas sans elle, la production d'alerte numéro 40.SSLv23_server_method()
indique que le serveur comprend SSLv2 et v3 et est maintenant obsolète. Pour prendre en charge TLS 1.1 et 1.2 de remplacer la méthodeTLS_server_method()
. sourceerror: ‘ssl’ undeclared
. Que suis-je censé faire? Il y a littéralement pas d'autres sources pour l'établissement d'une connexion à l'aide d'OpenSSL!#include <openssl/applink.c>
semble tout à fait tort. Ça doit être une spéciale pour windows uniquement la crasse.struct sockaddr_in saiServerAddress; bzero((char *) &saiServerAddress, sizeof(saiServerAddress));
, pourquoi ne pas simplement fairestruct sockaddr_in saiServerAddress = {};
? que fera le compilateur zéro tous les membres, vous n'avez pas spécifié dans{}
, qui est tous d'entre euxOpenSSL est assez difficile. Il est facile de accidentellement jeter tous votre sécurité en ne faisant pas de négociation exactement. (Zut, j'ai moi-même été mordu par un bug où curl n'était pas la lecture de la OpenSSL alertes exactement, et je ne pouvais pas parler à certains sites).
Si vous voulez vraiment simple et rapide, de mettre goujon en face de votre programme de l'appeler un jour. Ayant SSL dans un processus différent de ne pas vous ralentir: http://vincent.bernat.im/en/blog/2011-ssl-benchmark.html
Pour d'autres comme moi:
Il était une fois un exemple dans le protocole SSL source dans le répertoire
demos/ssl/
avec des exemples de code en C++. Maintenant il est disponible uniquement via l'histoire:https://github.com/openssl/openssl/tree/691064c47fd6a7d11189df00a0d1b94d8051cbe0/demos/ssl
Vous aurez probablement à trouver une version de travail, j'ai posté cette réponse le 6 Novembre 2015. Et j'ai dû modifier la source -- pas beaucoup.
Certificats: .pem dans
demos/certs/apps/
: https://github.com/openssl/openssl/tree/master/demos/certs/appsIci mon exemple socket ssl threads serveur (connexion multiple) https://github.com/breakermind/CppLinux/blob/master/QtSslServerThreads/breakermindsslserver.cpp