CLASSE CLIENT TYPE NORMAL OU CRYPTE (SSL) WINDOWS/LINUX
cs_Nebula
Messages postés787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 2007
-
6 juin 2005 à 02:06
djmoa
Messages postés39Date d'inscriptionmercredi 6 octobre 2004StatutMembreDernière intervention27 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.
djmoa
Messages postés39Date d'inscriptionmercredi 6 octobre 2004StatutMembreDernière intervention27 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és65Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention17 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és65Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention17 décembre 2007 30 avril 2007 à 09:57
newzeh
Messages postés1Date d'inscriptionvendredi 22 avril 2005StatutMembreDernière intervention16 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és39Date d'inscriptionmercredi 6 octobre 2004StatutMembreDernière intervention27 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és1Date d'inscriptionlundi 13 mars 2006StatutMembreDernière intervention14 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és6Date d'inscriptionsamedi 29 mars 2003StatutMembreDerniè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és22Date d'inscriptionmardi 20 mai 2003StatutMembreDerniè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
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és6Date d'inscriptionmardi 16 septembre 2003StatutMembreDerniè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/
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és65Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention17 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és65Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention17 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és787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 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és787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 20072 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) ?
30 avril 2007 à 10:55
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.
30 avril 2007 à 10:25
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,
30 avril 2007 à 09:57
g++ -Wall -c app.cpp -lssl
g++ -Wall -c client.cpp -lssl
Cordialement.
16 avril 2007 à 14:49
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
9 avril 2007 à 12:29
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 !
14 mars 2006 à 12:26
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.
6 mars 2006 à 01:23
je veux savoir comment je peux faire marcher ce programme sous windows et VC++.
merci j'attends une reponse c'est urgent
27 déc. 2005 à 13:43
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
8 juin 2005 à 11:42
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/
8 juin 2005 à 04:26
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 !
6 juin 2005 à 18:47
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.
6 juin 2005 à 17:50
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.
6 juin 2005 à 02:20
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
6 juin 2005 à 02:06
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) ?