begin process at 2008 08 29 22:11:13
1 233 910 membres
431 nouveaux aujourd'hui
14 294 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

Catégorie :Réseaux & Internet Classé sous : socket, client, ssl, serveur Niveau : Initié Date de création : 05/06/2005 Date de mise à jour : 07/01/2007 23:25:25 Vu / téléchargé: 6 887 / 811

Note :
4 / 10 - par 1 personne
4,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

Description

Une classe "client" qui sert à se connecter à un serveur qui utilise une connexion  soit normale soit cryptée. C'est au choix. Cette classe va de paire avec une autre classe récemment publiée sur le site : la classe serveur (vous avez vu, bien trouvé le nom !) disponible ici http://www.cppfrance.com/code.aspx?id=31155
Les foctions de cette classe sont documentées dans le code.

Source

  • /***************************************************************************
  • server - description
  • -------------------
  • begin : jeu oct 28 2004
  • copyright : (C) 2004 by neoTHGLF
  • email : neoTHGLF.neoTHGLF@laposte.net
  • ***************************************************************************/
  • /***************************************************************************
  • * *
  • * This program is free software; you can redistribute it and/or modify *
  • * it under the terms of the GNU General Public License as published by *
  • * the Free Software Foundation; either version 2 of the License, or *
  • * (at your option) any later version. *
  • * *
  • ***************************************************************************/
  • #ifndef CLIENT_H
  • #define CLIENT_H
  • #include <iostream>
  • #include <string>
  • #include <openssl/ssl.h>
  • #ifdef WIN32
  • #include <winsock2.h>
  • typedef int socklen_t;
  • #pragma comment(lib,"ws2_32.lib")
  • #pragma comment(lib,"ssleay32.lib")
  • #pragma comment(lib,"libeay32.lib")
  • #else
  • #include <sys/types.h>
  • #include <sys/socket.h>
  • #include <netdb.h>
  • #include <netinet/in.h>
  • #endif
  • using std::cout;
  • using std::cin;
  • using std::endl;
  • using std::flush;
  • using std::string;
  • /**
  • @author neoTHGLF
  • */
  • class client{
  • public:
  • int client_set(short client_sin_family,char *adresse,int port,bool ssl_server); //Make the skeleton of the client
  • int client_connect();
  • int client_write(char *msg);
  • int client_read(char *msg);
  • int client_get_fd();
  • SSL *client_get_SSL_fd();
  • char *convert(string str);
  • private:
  • #ifdef WIN32
  • SOCKET fd;
  • #else
  • int fd;
  • #endif
  • SSL *SSL_fd; /* SSL socket */
  • struct sockaddr_in server_addr;
  • int client_len;
  • int SSL_error_code; /* SSL functions returns*/
  • bool server_ssl_state;
  • };
  • #endif
/***************************************************************************
                          server  -  description
                             -------------------
    begin                : jeu oct 28 2004
    copyright            : (C) 2004 by neoTHGLF
    email                : neoTHGLF.neoTHGLF@laposte.net
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/
#ifndef CLIENT_H
#define CLIENT_H

#include <iostream>
#include <string>
#include <openssl/ssl.h>

#ifdef WIN32
	#include <winsock2.h>
	typedef int socklen_t;
	#pragma comment(lib,"ws2_32.lib")
	#pragma comment(lib,"ssleay32.lib")
	#pragma comment(lib,"libeay32.lib")
#else
	#include <sys/types.h>
	#include <sys/socket.h>
	#include <netdb.h>
	#include <netinet/in.h>
#endif


using std::cout;
using std::cin;
using std::endl;
using std::flush;
using std::string;

/**
@author neoTHGLF
*/
class client{
public:

    int client_set(short client_sin_family,char *adresse,int port,bool ssl_server); //Make the skeleton of the client
	int client_connect();
	int client_write(char *msg);
	int client_read(char *msg);
    int client_get_fd();
    SSL *client_get_SSL_fd();

	char *convert(string str);   

private:

#ifdef WIN32
	SOCKET fd;
#else
	int fd;
#endif

    SSL *SSL_fd;		/* SSL socket */
    
    struct sockaddr_in server_addr;
    int client_len; 
	int SSL_error_code;								/* SSL functions returns*/
	bool server_ssl_state;
    
};

#endif

Conclusion

Si jamais il subsiste des bugs, que vous trouvez que j'ai mal documenté ou que j'ai fait des erreurs de documentation, faites m'en part, je corrigerais. Je suis ouvert à toute suggestion.
Cordialement.

ps : le code entier est ds le zip. Le code présenté à l'écran est le code contenu dans l'header : client.h.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

07 janvier 2007 23:25:25 :
Simplement une mise à jour des mots clés
  • signaler à un administrateur
    Commentaire de Nebula le 06/06/2005 02:06:58

    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) ?

  • signaler à un administrateur
    Commentaire de Nebula le 06/06/2005 02:20:15

    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

  • signaler à un administrateur
    Commentaire de neoTHGLF le 06/06/2005 17:50:42

    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.

  • signaler à un administrateur
    Commentaire de neoTHGLF le 06/06/2005 18:47:23

    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.

  • signaler à un administrateur
    Commentaire de Nebula le 08/06/2005 04:26:03

    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 !

  • signaler à un administrateur
    Commentaire de sylvainmarechal le 08/06/2005 11:42:47

    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/

  • signaler à un administrateur
    Commentaire de Klephte le 27/12/2005 13:43:33

    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

  • signaler à un administrateur
    Commentaire de menjra2000 le 06/03/2006 01:23:09

    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

  • signaler à un administrateur
    Commentaire de sevgautok le 14/03/2006 12:26:13

    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.

  • signaler à un administrateur
    Commentaire de djmoa le 09/04/2007 12:29:59

    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 !

  • signaler à un administrateur
    Commentaire de newzeh le 16/04/2007 14:49:08

    Salut
    J'ai telecharger ce code source client.cpp
    j'ai simplement ecrit ce code source app.cpp:
    #include "client.h"
    #include <iostream>
    #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

  • signaler à un administrateur
    Commentaire de neoTHGLF le 30/04/2007 09:57:58

    Salut NEWZEH, essaye :
    g++ -Wall -c app.cpp -lssl
    g++ -Wall -c client.cpp -lssl

    Cordialement.

  • signaler à un administrateur
    Commentaire de neoTHGLF le 30/04/2007 10:25:23

    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,

  • signaler à un administrateur
    Commentaire de djmoa le 30/04/2007 10:55:42

    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.

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS