J'ai écrit des programmes C simples, qui utilisent des sockets («client» et «serveur»). (Utilisation UNIX / Linux)
Le côté serveur crée simplement un socket:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
Et puis le lie à sockaddr:
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
Et écoute (et accepte et lit):
listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
read(newsockfd,buffer,255);
Le client crée le socket, puis y écrit.
Maintenant, je veux convertir cette simple connexion en une connexion SSL, de la manière la plus simple, la plus idyllique, la plus soignée et la plus rapide.
J'ai essayé d'ajouter OpenSSL à mon projet, mais je ne trouve pas de moyen simple de mettre en œuvre ce que je veux.
stunnel
, lestunnel4
paquet est dans des distributions basées sur Debian et il est facile à utiliser. Il existe certaines limitations par rapport à l'ajout d'un support SSL approprié sur votre serveur, mais cela peut être bon pour une solution rapide. J'aime stunnel car il semble correspondre à l'approche des outils logiciels UNIX.Réponses:
Il y a plusieurs étapes lors de l'utilisation d'OpenSSL. Vous devez avoir un certificat SSL qui peut contenir le certificat avec la clé privée, assurez-vous de spécifier l'emplacement exact du certificat (cet exemple l'a à la racine). Il existe de nombreux didacticiels de qualité.
Certains comprennent:
Vous devrez initialiser OpenSSL:
Maintenant, pour l'essentiel des fonctionnalités. Vous pouvez ajouter une boucle while sur les connexions.
Vous pouvez alors lire ou écrire en utilisant:
Update Le
SSL_CTX_new
doit être appelé avec la méthode TLS qui correspond le mieux à vos besoins afin de prendre en charge les nouvelles versions de sécurité, au lieu deSSLv23_server_method()
. Voir: Description d'OpenSSL SSL_CTX_newla source
if
est faux cependant. Ce ne devrait être qu'alorsif (ssl_err <= 0) {
que c'est une erreur.SSL_accept()
retourne1
sur succès,0
sur «échec contrôlé» et-1
sur «échec fatal». Voir la page de manuel.SSL_CTX_set_tmp_dh[_callback]()
ne sont pas appelés. Je viens de découvrir à la dure qu'un chiffrement NULL ne fonctionnera pas sans lui, produisant le numéro d'alerte 40.SSLv23_server_method()
que le serveur comprend SSLv2 et v3 et est désormais obsolète. Pour prendre en charge TLS 1.1 et 1.2, remplacez cette méthode parTLS_server_method()
. sourceOpenSSL est assez difficile. Il est facile de jeter accidentellement toute votre sécurité en ne négociant pas exactement comme il faut. (Heck, j'ai été personnellement mordu par un bug où curl ne lisait pas exactement les alertes OpenSSL et ne pouvait pas parler à certains sites.)
Si vous voulez vraiment rapide et simple, placez le goujon devant votre programme et appelez-le par jour. Avoir SSL dans un processus différent ne vous ralentira pas: http://vincent.bernat.im/en/blog/2011-ssl-benchmark.html
la source
Pour d'autres comme moi:
Il y avait une fois un exemple dans la source SSL dans le répertoire
demos/ssl/
avec un exemple de code en C ++. Désormais, il n'est disponible que via l'historique: https://github.com/openssl/openssl/tree/691064c47fd6a7d11189df00a0d1b94d8051cbe0/demos/sslVous devrez probablement trouver une version fonctionnelle, j'ai initialement publié cette réponse le 6 novembre 2015. Et j'ai dû modifier la source - pas grand-chose.
Certificats: .pem dans
demos/certs/apps/
: https://github.com/openssl/openssl/tree/master/demos/certs/appsla source
Voici mon exemple de threads de serveur de socket ssl (connexion multiple) https://github.com/breakermind/CppLinux/blob/master/QtSslServerThreads/breakermindsslserver.cpp
la source