До сих пор мой прокси-сервер обрабатывал только HTTP-соединения на порту 80: я хотел бы улучшить его и заставить управлять HTTPS-запросами. Вот как это работает:OpenSSL: прокси HTTPS
Прокси прослушивает данный порт; Chrome может «видеть» прокси-сервер благодаря плагину SwitchyOmega и подключать трафик на данном порту. Прокси считывает заголовок пакета, получает запрос (я просматриваю только GET
запросов до сих пор), например. GET http://www.google.it HTTP/1.1
, получает имя хоста разборе www.google.it
, находит IP-адрес, имя хоста разрешения с gethostbyname
и предполагает, что порт сервера является номером 80.
Теперь прокси отправить на сервер, что он получил от клиента при открытии сокета: этот сокет открывается, привязывается, а затем подключается к IP-адресу, который я разрешил ранее с имени хоста.
Я прочитал here как превратить гнездо в гнездо SSL: после socket
, bind
, listen
и accept
системных вызовов, установить, что вам нужно, и передать дескриптор файла сокета для SSL_set_fd
, так что я могу читать и писать данные через новый SSL файловый дескриптор.
Что (прежде всего) беспокоит меня - это создание контекста SSL: если SSLv23_server_method
для серверов и SSLv23_client_method
для клиентов, что я должен использовать для своего прокси-сервера?
Я не нашел конкретных прокси-серверов в OpenSSL documentation.
Заранее за вашу помощь.
Редактировать: более подробную информацию о том, как работает прокси-сервер.
Как вы реализуете свой HTTP-прокси? Если клиент отправляет запрос «GET' /' POST »вашему прокси, запрашивая абсолютный URL HTTPS, ваш прокси-сервер должен подключиться к целевому серверу и установить свой собственный сеанс SSL/TLS с сервером, а затем передать HTTP-запрос клиента и сервер. Если клиент отправляет запрос «CONNECT» на ваш прокси-сервер, ему необходимо подключиться к целевому серверу и передавать данные взад и вперед * как есть *, без участия SSL/TLS. Если прокси-сервер обрабатывал данные SSL/TLS клиента или сервера, он будет действовать как злоумышленник MITM, что-то SSL/TLS предназначено для предотвращения использования –
. SSL/TLS не имеет понятия прокси, а только соединения «точка-точка». Прокси-сервер имеет соединение с клиентом и отдельное соединение с целевым сервером, передавая данные между двумя соединениями. Он должен защищать (или не) эти соединения независимо друг от друга, и как вы должны это делать, зависит от того, как клиент запрашивает ваш прокси для передачи HTTP. –
Если я хорошо понял: прокси получает запрос от клиента, если запрос содержит подстроку 'GET https', прокси-сервер открывает на сервер сокет SSLed и отправляет данные; прокси получает ответ от сервера и отправляет данные клиенту через другой SSLed-сокет. Вместо того, чтобы иметь одно безопасное соединение между клиентом и сервером, с моим прокси-сервером у меня было бы безопасное соединение между клиентом и прокси-сервером и другое безопасное соединение между прокси-сервером и сервером: правильно? – elmazzun