Люди добрый, подскажите кто знает. Задача такая. Есть условный сервер www.host.ru:443. Требуется к нему подключиться через прокси proxy_ip: proxy_port. Подключение к серверу должно быть через SSL. Выполняю следующие действия. Создаю сокет для подключения к прокси: Code: #include <winsock.h> #include <string.h> #pragma comment(lib,"ws2_32.lib") int err, bytes_read; WSADATA wsaData; int a = WSAStartup( MAKEWORD(2,2), &wsaData ); 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(proxy_port); dest.sin_addr.s_addr = inet_addr(proxy_ip); err = connect(sd, (struct sockaddr*) &dest, sizeof(dest)); Сокет работает штатно без ошибок. Устанавливаю прокси-соединение с удаленным сервером методом CONNECT: Code: sprintf(outbuf,"CONNECT www.host.ru:443 HTTP/1.0\r\n"); strcat(outbuf,"User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)\r\n"); strcat(outbuf,"Proxy-Connection: Keep-Alive\r\n"); strcat(outbuf,"Connection: Keep-Alive\r\n"); strcat(outbuf,"Host: www.host.ru:443\r\n\r\n"); err = send(sd, outbuf, strlen(outbuf), 0); bytes_read = recv(sd, inbuf, sizeof(inbuf), 0 ); inbuf[bytes_read] = '\0'; Получаю ответ от прокси-сервера, что соединение установлено: Code: HTTP/1.0 200 Connection established Далее пытаюсь отправить обычный GET-запрос серверу: Code: sprintf(outbuf,"GET / HTTP/1.0\r\n"); strcat(outbuf,"Host: www.host.ru:443\r\n"); strcat(outbuf,"User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)\r\n"); strcat(outbuf,"Accept: text/html\r\n"); strcat(outbuf,"Accept-Language: ru,en-us;q=0.7,en;q=0.3\r\n"); strcat(outbuf,"Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n"); strcat(outbuf,"Connection: Keep-Alive\r\n\r\n"); err = send(sd, outbuf, strlen(outbuf), 0); bytes_read = recv(sd, inbuf, sizeof(inbuf), 0 ); inbuf[bytes_read] = '\0'; И... в ответ ничего. Ответ приходит пустой. Перепробовал кучу разных HTTP-прокси, всевозможные варианты запроса - ответ всегда приходит пустой. Своей головой больше ничего не могу придумать. Подскажите, кто шарит в прокси-запросах.
SSL-соединение устанавливается на уровне сервер-прокси после запроса CONNECT. На уровне клиент-прокси SSL-соединения нет.
Хм... В таком случае я правильно понимаю, после запуска сокета и коннекта мне необходимо подключить к сокету SSL и отправлять секурный траф на сервер? Code: #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> SSL *ssl; SSL_CTX *ctx; const SSL_METHOD *client_method; SSLeay_add_ssl_algorithms(); client_method = TLSv1_client_method(); SSL_load_error_strings(); ctx = SSL_CTX_new(client_method); ssl = SSL_new(ctx); SSL_set_fd(ssl, sd); err = SSL_connect(ssl); SSL_get_cipher(ssl); err = SSL_write(ssl, outbuf, strlen(outbuf)); // запрос err = SSL_read(ssl, inbuf, sizeof(inbuf)); // ответ Я пробовал подключать SSL сразу к сокету еще до коннекта с прокси и ничего не работало...