Нигде не могу найти толковой инфы, 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(); не канает... хенд шейком через прокси обмениваются или нет?
Тебе нужно сначала заставить прокси-сервер соединится с удаленным хостом на указанный порт, получить от него поток, а потом в этом потоке производить 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 обработчику, который будет производить хендщейк и т.п., т.е. можно работать с этим потоком, как соединившимся напрямую к серверу.
200 статус - есть. делее обмен хенд шейком Ssocket.startClientEncryption(); и все, отправляю заголовки, в ответ ничего..
есть небольшой прогресс, пробовал подключатся к разным серверам, как оказалось неработает только с сайтами с cloudfare, но через проксификаторы заходит нормально, собсвенно вопрос, что там такого особенного делают проксификаторы?
А может у тебя ещё и винда не работает? Какая-то детская отмазка. Раз не работает - сделай чтоб работал. Может ты ещё код в блокноте пишешь потому что у тебя IDE не работает? Здесь ошибка аш в двух местах. Во-первых неизвестно завершилась-ли функция connectToHost() успешно. Может соединение с проксей вообще не установилось. После connectToHost нужно проверять установлено-ли соединение. Если оно не установлено то последующий код выполнять нет смысла. Во-вторых ты пытаешься инициировать шифрование до того как прокси-сервер со своей стороны подключится к серверу назначения (domain). Информация по инэту летает не со скоростью света а серверы операции выполняют не за 0 секунд. Перед startClientEncryption() тебе сначала нужно дождаться ответа от прокси "HTTP/1.1 200 Connected". Ответа от прокси следует ожидать в течение нескольких секунд. Если (например) через 5 секунд прокся ничего не ответила то твоя программа должна выдавать ошибку "сорян, это дохлая прокся и она не отвечает на http-запросы". И только когда твоя программа дождётся ответа с кодом 200 - только тогда можно уже начинать хендшейк, но никак не раньше. Проще говоря, твоя проблема в следующем: ты коннектишься к проксе и инициируешь хендшейк ещё до того как прокся подключится к удалённому серверу. А потом прокся выдаёт HTTP-ответ (не важно код 200 или код ошибки) и этот HTTP-ответ попадает в парсер SSL-библиотеки которая вместо нормального хендшейка видит HTTP-ответ прокси и не понимает что это такое. Кстати, прокся совсем не обязательно отвечает кодом 200. Если прокся сама не сможет подключиться к удалённому серверу то ответит кодом 4xx или 5xx. А может прокся требует авторизации, соответственно соединение не установлено и прокся намекает, что сначала нужно ввести пароль. В общем тебе обязательно нужно дожидаться ответа прокси и смотреть какой он. Если код ответа отличается от 200 значит соединение по какой-то причине не установлено.
у меня все проверки есть, не нужно так критиковать, то код я просто выложил чтобы можно было проследить последоватеьность действий, и еще, я писал и был бы внимательным уже б можно было твой пост не писать вообще. Ну и в общем проблема решена, методом тыка) нужно было перед обменом хендшейка вызвать функцию setPeerName, зачем в случае с cloudfare это делать не знаю, так как не знаю всех тонкостей обмена хендшейком ,но работает, всем спасибо за участие.
А как клоудфлара (да и не только она) тогда узнает ключём какого домена расшифровывать трафик? Man SNI. Без указания имени домена подключаться можно только к сервакам у которых один сертификат на айпишник. У клоудфлары на одном айпишнике целая куча сертификатов и каким из них расшифровывать трафик без SNI она не знает.