CLASSE CLIENT TYPE NORMAL OU CRYPTE (SSL) WINDOWS/LINUX

cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 - 6 juin 2005 à 02:06
djmoa Messages postés 39 Date d'inscription mercredi 6 octobre 2004 Statut Membre Dernière intervention 27 mai 2009 - 30 avril 2007 à 10:55
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/31861-classe-client-type-normal-ou-crypte-ssl-windows-linux

djmoa Messages postés 39 Date d'inscription mercredi 6 octobre 2004 Statut Membre Dernière intervention 27 mai 2009
30 avril 2007 à 10:55
ben justement, c'etait un programme de test, et a part les include et la déclaration du main, il n'y a rien d'autre...
En revanche, si le programme me dit que je ne recois rien, lorsque j'espionne avec ethereal, je vois bien la page de retour qui arrive dans l'ordi ...

la pauvre, elle doit etre fatiguée apres tout ce chemin a grande vitesse sur le net et elle c'est perdue en arrivant dans mon pc ... paix a son ame ...

J'essayerai sur un autre ordi, merci
pour les interesés, j'ai finalement fait mon prog en java, c'est tressssss simple. pensez y.
neoTHGLF Messages postés 65 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 17 décembre 2007
30 avril 2007 à 10:25
Salut DjMoa,
Désolé pour le retard.

pour ma part le code que tu as tapé fonctionne très bien. Peut être le probleme se situe t'il autre part dans ton programme ?

Cordialement,
neoTHGLF Messages postés 65 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 17 décembre 2007
30 avril 2007 à 09:57
Salut NEWZEH, essaye :
g++ -Wall -c app.cpp -lssl
g++ -Wall -c client.cpp -lssl

Cordialement.
newzeh Messages postés 1 Date d'inscription vendredi 22 avril 2005 Statut Membre Dernière intervention 16 avril 2007
16 avril 2007 à 14:49
Salut
J'ai telecharger ce code source client.cpp
j'ai simplement ecrit ce code source app.cpp:
#include "client.h"
#include
#include <sys/types.h>
#include <sys/socket.h>
using namespace std;
int main()
{
client *obj;
obj = new client();
obj->client_set(1,"192.168.1.1",443,1);
return 0;
}
//end
J'ai tapé au shell de linux la commande suivante:
g++ -Wall -c app.cpp
g++ -Wall -c client.cpp
c bon jusqu'ici
ensuite lorsque je tape cette commande: g++ app.o client.o -o app

j'ai ce message d'erreur:
/tmp/ccWh5xOV.o: In function `client::client_read(char*)':
client.cpp:(.text+0x11c): référence indéfinie vers « SSL_read »
/tmp/ccWh5xOV.o: In function `client::client_write(char*)':
client.cpp:(.text+0x208): référence indéfinie vers « SSL_write »
/tmp/ccWh5xOV.o: In function `client::client_connect()':
client.cpp:(.text+0x2e4): référence indéfinie vers « SSL_load_error_strings »
client.cpp:(.text+0x2e9): référence indéfinie vers « SSL_library_init »
client.cpp:(.text+0x2ee): référence indéfinie vers « SSLv23_client_method »
client.cpp:(.text+0x2fc): référence indéfinie vers « SSL_CTX_new »
client.cpp:(.text+0x30a): référence indéfinie vers « SSL_new »
client.cpp:(.text+0x357): référence indéfinie vers « SSL_set_fd »
client.cpp:(.text+0x3ac): référence indéfinie vers « SSL_connect »
collect2: ld returned 1 exit status

Merci d'avance de votre aide
djmoa Messages postés 39 Date d'inscription mercredi 6 octobre 2004 Statut Membre Dernière intervention 27 mai 2009
9 avril 2007 à 12:29
Salut a tous.
Cette classe me semble tout a fait bien, et surtout tres utile, bravo!
Mais néanmoins, j'ai un petit problème pour la faire fonctionner...
Je n'ai rien en lecture (0 octets lus)!!! voici mon petit code de test en mode non sécurisé (sachan que ca marche pas mieu en sécurisé...
char buf[1024]
client c;
c.client_set(AF_INET,"64.233.183.103",80,false);
if(c.client_connect()==2){
int ln;
cout<<_T("connecté")<<endl;
ln=c.client_write("GET / HTTP/1.1\r\n\r\n");
cout<<"envoyé: "<<ln<<endl;
ln=c.client_read(buf);
cout<<"lu: "<<ln<<endl;
cout<<buf<<endl;

sachant bien sur que la requete est correcte (fonctionne tres bien avec le meme code en MFC).
Merci de votre aide !
sevgautok Messages postés 1 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 14 mars 2006
14 mars 2006 à 12:26
Bonjour,
a mon tour de me lancer dans la securisation de mon appli client/serveur en utilisant SSL.
J'en viens a l'erreur SSL_ERROR_WANT_READ. Dans mon cas, elle apparait en retour de l'appel de SSL_accept. Mes sockets sont non bloquantes. Je n'arrive pas a me depatouiller de ca.
En gros j'ai mon client qui fait un SSL_connect et au niveau du serveur j'ai ce probleme.
Malgré tous les exemples que j'ai pu trouver sur le net, je n'ai pas reussi a resoundre ca.
Merci infiniment pour tout reponse.
menjra2000 Messages postés 6 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 6 mars 2006
6 mars 2006 à 01:23
salut tout le monde je suis trop interesse pour faire marcher dess programmes utilisant les bibliotheques ssl mais je sais pas ou les trouver sur windows ( j'ai pas ses bibliotheques)

je veux savoir comment je peux faire marcher ce programme sous windows et VC++.

merci j'attends une reponse c'est urgent
cs_Klephte Messages postés 22 Date d'inscription mardi 20 mai 2003 Statut Membre Dernière intervention 4 janvier 2022
27 déc. 2005 à 13:43
Salut, bravo pour ce bel exemple de développement à base d'OpenSSL.

Si tu me le permets, je ferai néanmoins une remarque complémentaire concernant la lecture des données de la socket à l'aide de la fonction SSL_read car, tu dois ajouter un test complémentaire SSL_ERROR_WANT_READ afin de t'assurer que tu ne tentes pas un décryptage trop hâtif d'un buffer partiel.

Voici ce que j'ai écrit dans mon code à l'époque :
nBytes = SSL_read (conn.ssl, conn.acBuffer + conn.nCharsInBuffer,kBufferSize - conn.nCharsInBuffer - 1);
// Si SSL_read renvoie l'erreur SSL_ERROR_WANT_READ (code 2), cela signifie que l'api ssl a besoin
// de données complémentaires pour décoder le buffer, on effectue donc une relecture jusqu'à ce que
// cette erreur disparaisse

while ((nBytes==-1) && (SSL_get_error(conn.ssl,nBytes) == SSL_ERROR_WANT_READ)){
nBytes = SSL_read (conn.ssl, conn.acBuffer + conn.nCharsInBuffer,kBufferSize - conn.nCharsInBuffer - 1);
}

Pour vérifier que tout s'est bien passé alors j'utilise cette fonction :
SSL_get_error(conn.ssl,nBytes) == SSL_ERROR_NONE

Pour avoir le détail de l'erreur :
int sslerror = SSL_get_error(conn.ssl,nBytes);
char error_buffer[120];
ERR_error_string(sslerror, error_buffer,120);



Arnaud Grandville
sylvainmarechal Messages postés 6 Date d'inscription mardi 16 septembre 2003 Statut Membre Dernière intervention 8 juin 2005
8 juin 2005 à 11:42
Bonjour,

Juste qq remarques concernant les BIO :
-le plus simple pour apprendre a utiliser les BIO est d'etudier le programme ssltest.c du repertoire ssl d'openssl

-L'utilisation des BIO est utile si on souhaite encripter un flux en memoire, ou bien par exemple utiliser les IOCP sous Windows. Dans le cas contraire, il est plus raisonnable d'utiliser openssl avec des socket bloquantes ou non bloquantes, avec l'api haut niveau (SSL_read, SSL_write etc...).

-Un tres bon exemple d'utilisation d'openssl + doc (socket bloquantes et non bloquantes) ici (pour linux mais facilement portable a windows) http://www.rtfm.com/openssl-examples/

Sylvain
---
http://sylvainmarechal.chez.tiscali.fr/
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
8 juin 2005 à 04:26
Hm bizarre, j'en avais pas eu besoin :-/

Pour les BIO tu peux commencer par ce site, qui dégrossit pas mal l'API (tout est en mode bloquant, si tu trouves en mode non-bloquant cela m'intéresse) : http://www-128.ibm.com/developerworks/linux/library/l-openssl.html

Je suis bien d'accord avec toi, la documentation d'OpenSSL est fouillis au possible et pour couronner le tout, elle est pas terminée... Mais c'est mieux que rien, et le dossier d'exemples vient la compléter ;-)

Pour le générateur de nombres aléatoires, tu l'initialises une fois au début de ton programme (au lancement par exemple, avant de créer tes connexions SSL), et puis c'est tout. Perso j'utilise rien sous Linux (il va chercher tout seul /dev/urandom ou /dev/random si le premier n'est pas disponible), et la CryptoAPI sous Windows pour en tirer un buffer de 2048 octets. Mais RAND_screen peut te suffire, si tu n'as pas besoin d'un truc très sécurisé.

Bon courage pour la suite !
neoTHGLF Messages postés 65 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 17 décembre 2007
6 juin 2005 à 18:47
Après avoir essayé de retirer WSAStartup et WSACleanup, le programme plante. Je pense donc que ces deux fonctions sont utiles.
Par ailleurs, je ne trouve aucune documentation sur l'utilisation des BIO, aurais tu une piste ?
De même, j'ai lu la doc pour le générateur de nombres aléatoires, et je ne sait pas si je dois le lancer une fois en début de programme ou bien si je dois le lancer à chaque fois que je transfère une donnée. En gros je comprends mal le fonctionnement/l'utilisation d'un générateur de nombres aléatoires, une piste aussi ?
Merci.
Cordialement.
neoTHGLF Messages postés 65 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 17 décembre 2007
6 juin 2005 à 17:50
Merci beaucoup pour ces remarques. Je vais modifier le SSL_v23_client_method, je ne savait pas qu'il existait des failles dans SSLv2. Pour la gestion des exceptions, malheureusement je ne comprends encore pas très bien la façon dont elles fonctionnent, je vais m'y atteler de plus près.
Pour les BIO, malheureusement, je trouve la documentation fournie sur le site www.openssl.org extrèmement obscure, je vais aussi m'y atteler (pour la énième fois) de plus près.
De même, je vais lire la doc sur le générateur de nombres aléatoires, il me semble effectivement que c'est un point clé vis à vis de la sécurité. Et ben, j'ai encore de nombreuses améliorations à faire ! ;) Je me souhaite bonne chance !
Cordialement.
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
6 juin 2005 à 02:20
En relisant un peu plus attentivement, j'ai trois autres petites remarques :

1) OpenSSL fournit une interface d'abstraction appelée BIO (Basic Input/Output, je crois) qui permet d'utiliser le même code pour gérer des sockets SSL et des sockets normaux, tu devrais y jeter un oeil çà allégerait un peu ton code :)

2) les fonctions winsock WSAStartup et WSACleanup sont appelées par OpenSSL, elles sont donc inutiles dans le corps de ton programme

3) il faut absolument initialiser le générateur de nombres aléatoires, sinon ta session SSL est théoriquement reproductible et vulnérable... Plus d'informations dans la doc, http://www.openssl.org/docs/crypto/RAND_add.html
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
6 juin 2005 à 02:06
Salut, pas mal du tout. Par contre l'utilisation de SSLv23_client_method n'est pas recommandée pour un client (sauf si tu désactives SSLv2 avec SSL_CTX_set_options ou SSL_set_options avant), car ce protocole comporte de multiples failles toujours actives car inhérentes à sa conception même... SSLv3 et TLSv1 sont les standards actuels ;-)

Un autre truc (je dis tout de suite que je ne fais pas de C++ mais du C, mais çà doit être valable quand même) : la gestion des erreurs est intégrée dans ta classe, ne serait-il pas préférable de déclencher des exceptions (méthode préférée du C++ il me semble) ?
Rejoignez-nous