Пишу софтину на Си (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] }
что значит, требуется изучать исходники на Linux. серьёзно, alkos. сам гонял этот код, и справился с оптимизацией на -O3 gcc 4.8
к сожалению не могу помочь ничем конкретным, ибо не в теме, но подкину нагугленное, может быть поможет. SSL_connect() -> -1 -> ssl_get_error() -> 5 -> SSL_ERROR_SYSCALL: altblitz а ты уже порядком поднадоел со своими исходниками линупса, уединись уже с ними чтоль и хоть обоптимизируйся.
Разобрался, оказывается сервер не поддерживал client_method = SSLv2_client_method(). Замена на SSLv3_client_method() решила проблему.