C/C++ и OpenSSL

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by alkos, 11 Aug 2013.

  1. alkos

    alkos Elder - Старейшина

    Joined:
    28 Mar 2007
    Messages:
    1,148
    Likes Received:
    292
    Reputations:
    271
    Пишу софтину на Си (Visual Studio 6.0), работающую через ssl. Установил OpenSSL, подключил инклуды и библиотеки, заюзал пример реализации из интернета. Вроде бы все ОК, но фукнция SSL_connect(ssl); постоянно равняется -1 (выделено оранжевым цветом в коде). Все предыдущие операции выполняются без ошибки. Целый день бьюсь над проблемой, не знаю как решить. Обращаюсь к знактокам за помощью!

    Code:
    [COLOR=White]#include <winsock.h>
    #include <string.h>
    #pragma comment(lib,"ws2_32.lib")
    #pragma comment(lib, "libeay32.lib")
    #pragma comment(lib, "ssleay32.lib")
    #include <openssl/rsa.h>
    #include <openssl/evp.h>
    #include <openssl/objects.h>
    #include <openssl/x509.h>
    #include <openssl/err.h>
    #include <openssl/pem.h>
    #include <openssl/ssl.h>
    
    #define HTTP_HOST "127.0.0.1"
    #define HTTP_PORT 443
    
    int Connect()
    {
        SSL *ssl;
        SSL_CTX *ctx;
        const SSL_METHOD *client_method;
        X509 *server_cert;
        int err;
        char *str,outbuf[4096],inbuf[4096];
        WSADATA wsd;
     
        if ( WSAStartup ( MAKEWORD(1,0), &wsd) )
        {
    		printf ( " WSAStart error %d \n ", WSAGetLastError ( ) );
    		return 0;
        }
    
        SSLeay_add_ssl_algorithms();
        client_method = SSLv2_client_method();
        SSL_load_error_strings();
        ctx = SSL_CTX_new(client_method);
     
        int sd = socket (AF_INET, SOCK_STREAM, 0);
        struct sockaddr_in dest;
        memset(&dest, '\0', sizeof(dest));
        dest.sin_family = AF_INET;
        dest.sin_port = htons(HTTP_PORT);
        dest.sin_addr.s_addr = inet_addr(HTTP_HOST);
      
        err = connect(sd, (struct sockaddr*) &dest, sizeof(dest));
        if (err < 0) perror("can't connect to server port");
        printf("TCP connection %s, port %d\n\n", HTTP_HOST, dest.sin_port);
     
     
        ssl = SSL_new(ctx);         /* create SSL stack endpoint */
        SSL_set_fd(ssl, sd);        /* attach SSL stack to socket */
        err = SSL_connect(ssl);     /* initiate SSL handshake */
        [COLOR=DarkOrange][B]printf("err=%i\n",err); \\err=-1[/B][/COLOR]
    	
    
        SSL_get_cipher(ssl);
    
     
        server_cert = SSL_get_peer_certificate(ssl);
        str = X509_NAME_oneline(X509_get_subject_name(server_cert), 0, 0);
        printf("      subject: %s\n", str);
        str = X509_NAME_oneline(X509_get_issuer_name(server_cert), 0, 0);
        printf("      issuer: %s\n\n", str); 
        X509_free(server_cert);
     
        sprintf(outbuf,"GET /login HTTP/1.0\n");
     
        err = SSL_write(ssl, outbuf, strlen(outbuf));
        shutdown (sd, 1);
    
       
     
        SSL_shutdown(ssl);
        closesocket ( sd ) ;
        SSL_free (ssl);
        SSL_CTX_free (ctx);
        WSACleanup ( );
        return 1;[/COLOR]
    }
    
    
     
  2. Ptr

    Ptr New Member

    Joined:
    1 Oct 2011
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    SSL_get_error?
     
  3. alkos

    alkos Elder - Старейшина

    Joined:
    28 Mar 2007
    Messages:
    1,148
    Likes Received:
    292
    Reputations:
    271
    =5 ...
     
  4. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,694
    Likes Received:
    3,149
    Reputations:
    236
    что значит, требуется изучать исходники на Linux.
    серьёзно, alkos.

    сам гонял этот код, и справился с оптимизацией на -O3 gcc 4.8
     
  5. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    к сожалению не могу помочь ничем конкретным, ибо не в теме, но подкину нагугленное, может быть поможет.

    SSL_connect() -> -1 -> ssl_get_error() -> 5 -> SSL_ERROR_SYSCALL:
    altblitz
    а ты уже порядком поднадоел со своими исходниками линупса, уединись уже с ними чтоль и хоть обоптимизируйся.
     
  6. alkos

    alkos Elder - Старейшина

    Joined:
    28 Mar 2007
    Messages:
    1,148
    Likes Received:
    292
    Reputations:
    271
    Разобрался, оказывается сервер не поддерживал client_method = SSLv2_client_method(). Замена на SSLv3_client_method() решила проблему.