ssl anfängerhilfe



  • Hallo,
    ich habe schon über google mit diversen Stichwörtern nach c/c++ tutorials für ssl gesucht, bin aber leider nicht fündig geworden, ebenso wenig wie hier im forum. ich suche eine anfänger tutorial um mit ssl eine sichere verbindung (im speziellen mit einem IRC server) herzustellen. über jeden tip, wo ich suchen kann und/oder quellcode beispiele bin ich sehr dankbar.



  • schau dir doch mal die Seite und den Quellcode von www.openssl.org an



  • auf der seite von openssl hab ich mich schon etwas umgeschaut, jedoch hab ich nur die api liste ohne beschreibung gefunden und kann damit leider nichts anfangen. wie gesagt ich suche ein einfaches beispiel wie ich ssl verbindungen erstellen kann



  • Ich hab mich jetzt etwas tiefer in die docs von openssl geworfen und habe nach einzelnen funktionen dann über google gesucht. rausgekommen ist dann ein mini https client (zusammengestellt aus einem borland tutorial und diversen forenbeiträgen)

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/param.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h>
    #include <openssl/crypto.h>
    #include <openssl/x509.h>
    #include <openssl/pem.h>
    #include <openssl/ssl.h>
    #include <openssl/err.h>
    
    int main ()
    {
            struct sockaddr_in host_addr;
            int size;
            int s;
            struct hostent *host;
            char hostname[MAXHOSTNAMELEN];
            char buf[1000];
            char request[1000];
    
            SSL_CTX *ctx;
            SSL *ssl;
            int err;
    
            printf("\nEnter Hostname: ");
            scanf("%s", &hostname);
            host = gethostbyname(hostname);
            if (host == NULL) {
                    fprintf(stderr, "Unknown Host %s\n", hostname);
                    return -1;
            }
            fflush(stdout);
            s = socket(PF_INET, SOCK_STREAM, 0);
            if (s < 0) {
                    fprintf(stderr, "Socket Error\n");
                    return -1;
            }
            host_addr.sin_family = AF_INET;
            host_addr.sin_addr = *((struct in_addr *)host->h_addr);
            host_addr.sin_port = htons(443);
            if (connect(s, (struct sockaddr *)&host_addr, sizeof(host_addr)) == -1) {
                    close(s);
                    fprintf(stderr, "Connection Error\n");
                    return -1;
            }
            SSL_load_error_strings();
            SSL_library_init();
            ctx=SSL_CTX_new(SSLv23_client_method());
            ssl=SSL_new(ctx);
            if(!ssl) {
                    close(s);
                    fprintf(stderr, "SSL creation error\n");
                    return -1;
            }
            SSL_set_fd(ssl, s);
            err=SSL_connect(ssl);
            if(!err) {
                    close(s);
                    fprintf(stderr, "SSL connect error\nretval: %d\n", err);
                    err=SSL_get_error(ssl, err);
                    fprintf(stderr, "SSL error: %d\n", err);
                    return -1;
            }
            sprintf(request,"GET %s HTTP/1.0\r\nHost: %s\r\n\r\n","/","www.kernel.org");
            err=SSL_write(ssl, request, strlen(request));
            if(!err) {
                    close(s);
                    fprintf(stderr, "SSL write error\n");
                    return -1;
            }
            while(1) {
                    int read_size;
                    read_size=SSL_read(ssl, buf, sizeof(buf)-1);
                    buf[read_size]='\0';
                    if (read_size > 0) {
                            printf("Getting %d Bytes of Data\nData: %s\n", read_size, buf);
                    } else {
                            break;
                    }
            }
            SSL_shutdown(ssl);
            SSL_free(ssl);
            SSL_CTX_free(ctx);
            fflush(stdout);
            close(s);
            return 0;
    }
    

    erstellt habe ich das ganze dann mit diesem befehl:

    gcc -I/usr/include/ -lssl -o sslclient sslclient.c
    

    als host habe ich kernel.org genommen und bekomme auch schön den html code zurück


Anmelden zum Antworten