Проблема с HTTP запросом через прокси методом CONNECT на C++

Discussion in 'Анонимность' started by alkos, 28 Jun 2015.

Thread Status:
Not open for further replies.
  1. alkos

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

    Joined:
    28 Mar 2007
    Messages:
    1,148
    Likes Received:
    292
    Reputations:
    271
    Люди добрый, подскажите кто знает.

    Задача такая. Есть условный сервер 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-прокси, всевозможные варианты запроса - ответ всегда приходит пустой. Своей головой больше ничего не могу придумать. Подскажите, кто шарит в прокси-запросах.
     
  2. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    230
    И где в этом коде реализация шифрования, раз SSL?
     
    _________________________
  3. alkos

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

    Joined:
    28 Mar 2007
    Messages:
    1,148
    Likes Received:
    292
    Reputations:
    271
    SSL-соединение устанавливается на уровне сервер-прокси после запроса CONNECT. На уровне клиент-прокси SSL-соединения нет.
     
  4. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    230
    Чего? CONNECT просто создает тунель и гоняет трафик туда-сюда.
     
    _________________________
  5. alkos

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

    Joined:
    28 Mar 2007
    Messages:
    1,148
    Likes Received:
    292
    Reputations:
    271
    Хм... В таком случае я правильно понимаю, после запуска сокета и коннекта мне необходимо подключить к сокету 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 сразу к сокету еще до коннекта с прокси и ничего не работало...
     
  6. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    230
    Да
     
    _________________________
  7. alkos

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

    Joined:
    28 Mar 2007
    Messages:
    1,148
    Likes Received:
    292
    Reputations:
    271
    Проблема решена, спасибо за помощь!
     
Loading...
Thread Status:
Not open for further replies.