Как правильно подключатся к https через https прокси?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Djoser, 2 Oct 2016.

  1. Djoser

    Djoser Member

    Joined:
    9 Nov 2015
    Messages:
    52
    Likes Received:
    11
    Reputations:
    0
    Нигде не могу найти толковой инфы,
    1) подключение к прокси то понятно,
    Code:
    Ssocket.connectToHost(ipProxy,PortProxy);
    Ssocket.write("CONNECT "+domain+":443 HTTP/1.1\r\n\r\n");
    2) к сереру тоже нет проблем,
    Code:
      Ssocket.connectToHost(domain, 443);
          Ssocket.startClientEncryption(); // обмен хендшейком
    Ну а вот к сереверу через прокси - никак!!!
    Code:
     
    Ssocket.connectToHost(ipProxy,PortProxy);
    Ssocket.write("CONNECT "+domain+":443 HTTP/1.1\r\n\r\n");
    Ssocket.startClientEncryption();
    
    не канает... хенд шейком через прокси обмениваются или нет?
     
  2. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    Тебе нужно сначала заставить прокси-сервер соединится с удаленным хостом на указанный порт, получить от него поток, а потом в этом потоке производить ssl хандшейк передавая ее соответствующему потоковому обработчику.
    К примеру для HTTPS прокси запрос будет такой:

    Code:
    CONNECT expample.com:443 HTTP/1.1\r\nHost: expample.com:443\r\nProxy-Connection: keep-alive\r\n\r\n
    
    Потом получить ответ от прокси ответ как HTTP, если будет 200 статус код, отдавать поток SSL обработчику, который будет производить хендщейк и т.п., т.е. можно работать с этим потоком, как соединившимся напрямую к серверу.
     
    #2 seosimf, 2 Oct 2016
    Last edited: 2 Oct 2016
  3. Djoser

    Djoser Member

    Joined:
    9 Nov 2015
    Messages:
    52
    Likes Received:
    11
    Reputations:
    0
    wtf?? а в имени темы что написано????
     
  4. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    Да, не заметил, сорри.
     
  5. Djoser

    Djoser Member

    Joined:
    9 Nov 2015
    Messages:
    52
    Likes Received:
    11
    Reputations:
    0
    200 статус - есть.

    делее обмен хенд шейком
    Ssocket.startClientEncryption();

    и все, отправляю заголовки, в ответ ничего..
     
  6. Djoser

    Djoser Member

    Joined:
    9 Nov 2015
    Messages:
    52
    Likes Received:
    11
    Reputations:
    0
    есть небольшой прогресс, пробовал подключатся к разным серверам, как оказалось неработает только с сайтами с cloudfare, но через проксификаторы заходит нормально, собсвенно вопрос, что там такого особенного делают проксификаторы?
     
  7. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    Возьми сравни запросы, которые отсылает профиксатор и твой qt код в wireshark-e.
     
  8. Djoser

    Djoser Member

    Joined:
    9 Nov 2015
    Messages:
    52
    Likes Received:
    11
    Reputations:
    0
    у меня не работает wireshark.
     
  9. pas9x

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

    Joined:
    13 Oct 2012
    Messages:
    423
    Likes Received:
    585
    Reputations:
    52
    А может у тебя ещё и винда не работает? Какая-то детская отмазка. Раз не работает - сделай чтоб работал. Может ты ещё код в блокноте пишешь потому что у тебя IDE не работает?

    Здесь ошибка аш в двух местах. Во-первых неизвестно завершилась-ли функция connectToHost() успешно. Может соединение с проксей вообще не установилось. После connectToHost нужно проверять установлено-ли соединение. Если оно не установлено то последующий код выполнять нет смысла.
    Во-вторых ты пытаешься инициировать шифрование до того как прокси-сервер со своей стороны подключится к серверу назначения (domain). Информация по инэту летает не со скоростью света а серверы операции выполняют не за 0 секунд. Перед startClientEncryption() тебе сначала нужно дождаться ответа от прокси "HTTP/1.1 200 Connected". Ответа от прокси следует ожидать в течение нескольких секунд. Если (например) через 5 секунд прокся ничего не ответила то твоя программа должна выдавать ошибку "сорян, это дохлая прокся и она не отвечает на http-запросы". И только когда твоя программа дождётся ответа с кодом 200 - только тогда можно уже начинать хендшейк, но никак не раньше.
    Проще говоря, твоя проблема в следующем: ты коннектишься к проксе и инициируешь хендшейк ещё до того как прокся подключится к удалённому серверу. А потом прокся выдаёт HTTP-ответ (не важно код 200 или код ошибки) и этот HTTP-ответ попадает в парсер SSL-библиотеки которая вместо нормального хендшейка видит HTTP-ответ прокси и не понимает что это такое.

    Кстати, прокся совсем не обязательно отвечает кодом 200. Если прокся сама не сможет подключиться к удалённому серверу то ответит кодом 4xx или 5xx. А может прокся требует авторизации, соответственно соединение не установлено и прокся намекает, что сначала нужно ввести пароль. В общем тебе обязательно нужно дожидаться ответа прокси и смотреть какой он. Если код ответа отличается от 200 значит соединение по какой-то причине не установлено.
     
    #9 pas9x, 3 Oct 2016
    Last edited: 3 Oct 2016
  10. Djoser

    Djoser Member

    Joined:
    9 Nov 2015
    Messages:
    52
    Likes Received:
    11
    Reputations:
    0
    у меня все проверки есть, не нужно так критиковать, то код я просто выложил чтобы можно было проследить последоватеьность действий, и еще, я писал
    и
    был бы внимательным уже б можно было твой пост не писать вообще.

    Ну и в общем проблема решена, методом тыка) нужно было перед обменом хендшейка вызвать функцию setPeerName, зачем в случае с cloudfare это делать не знаю, так как не знаю всех тонкостей обмена хендшейком ,но работает, всем спасибо за участие.
     
  11. pas9x

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

    Joined:
    13 Oct 2012
    Messages:
    423
    Likes Received:
    585
    Reputations:
    52
    А как клоудфлара (да и не только она) тогда узнает ключём какого домена расшифровывать трафик? Man SNI. Без указания имени домена подключаться можно только к сервакам у которых один сертификат на айпишник. У клоудфлары на одном айпишнике целая куча сертификатов и каким из них расшифровывать трафик без SNI она не знает.
     
    #11 pas9x, 3 Oct 2016
    Last edited: 3 Oct 2016