HTTPS-соединения через прокси-серверы

Возможно ли подключение HTTPS через прокси-серверы? Если да, то какой прокси-сервер позволяет это?

Дублировано с помощью Как использовать прокси Socks 5 с Apache HTTP-клиент 4?


person Community    schedule 05.02.2009    source источник
comment
Я думаю, это не дублируется с stackoverflow.com/questions/22937983/   -  person Uri    schedule 02.11.2015
comment
Да, возможно. См. Практические примеры здесь. stackoverflow.com / questions / 56981993 /   -  person Rick    schedule 12.07.2019


Ответы (9)


TLS / SSL (S в HTTPS) гарантирует отсутствие перехватчиков между вами и сервером, с которым вы связываетесь, то есть никаких прокси. Обычно вы используете CONNECT, чтобы открыть TCP-соединение через прокси. В этом случае прокси не сможет кэшировать, читать или изменять какие-либо запросы / ответы и, следовательно, будет бесполезным.

Если вы хотите, чтобы прокси мог читать информацию, вы можете использовать следующий подход:

  1. Клиент запускает сеанс HTTPS
  2. Прокси-сервер прозрачно перехватывает соединение и возвращает специально созданный (возможно, слабый) сертификат K a, подписанный центром сертификации, которому безоговорочно доверяет клиент.
  3. Прокси запускает сеанс HTTPS для таргетинга
  4. Прокси-сервер проверяет целостность SSL-сертификата; отображает ошибку, если сертификат недействителен.
  5. Прокси-сервер передает содержимое, расшифровывает его и повторно шифрует с помощью K a
  6. Клиент отображает материал

Примером может служить SSL-удар Squid. Точно так же можно настроить burp для этого . Это также было используется в менее благоприятном контексте египетским интернет-провайдером.

Обратите внимание, что современные веб-сайты и браузеры могут использовать HPKP или встроенные булавки сертификатов, которые опровергают этот подход.

person phihag    schedule 05.02.2009
comment
В принципе это может сработать, но браузеры не так взаимодействуют с HTTP-прокси для HTTPS-запросов. То, как это описано здесь, подразумевает, что прокси-сервер фактически является человеком-посередине (поэтому ему следует доверять соответственно). - person Bruno; 06.07.2010
comment
Squid делает это. Это называется SSL Bump. - person Adam Mackler; 04.09.2013
comment
Не будет работать без большого количества предупреждений для конечного пользователя. безоговорочно доверяет клиенту - такого не бывает. Даже если сертификат идеален - AAA +++, он по-прежнему показывает другой домен, не соответствующий тому, что запрашивал конечный пользователь, что заставит любой нормальный браузер (не имея в виду IE здесь ...) прыгать вверх и вниз с криком. Конечно, можно использовать wget с параметрами, отключающими проверки SSL, но знаете что? это соединение больше не может называться SSL после отключения основных проверок безопасности. - person Van Jone; 19.11.2015
comment
@Van Jone Unconditionally trusted относится к сертификату CA. Сертификаты CA не имеют доменов. Я изменил ответ двумя примерами, где это работает / работает на практике без каких-либо предупреждений для пользователя. - person phihag; 19.11.2015
comment
@phihag Мы говорим о разных вещах. Да, поддельный CA может подтвердить действительность поддельного сертификата, если он установлен в клиентском браузере / ОС, но это не предполагаемое средство для победы над MITM. Случай Anti-MITM: клиент по-прежнему знает, что совершенно действительный (хотя и фальшивый) сертификат принадлежит домену другого сервера. Клиенты проверяют соединения с помощью сертификатов сервера, а не с помощью CA, поэтому они должны сопоставлять DN и предупреждать пользователя о ненадежном соединении (которое, конечно, пользователь может игнорировать по своему незнанию). На странице Squid BUMP также есть заметки об этом предупреждении. P.S. Я не возражаю против правильности 1-й части ответа на ОП. - person Van Jone; 20.11.2015
comment
Мой ответ основан на том, что вы называете фиктивным центром сертификации. Сертификат ЦС является безусловно надежным либо потому, что пользователь (или программное обеспечение на его компьютере, например, корпоративная конфигурация или вредоносное ПО) настроило его таким образом, либо потому что ЦС был получен от одного из ЦС. доверяют основные браузеры, как и в случае с MCS. Прокси-сервер генерирует новый действительный сертификат для каждого домена, запрашиваемого клиентом, поэтому без средств защиты от MITM, упомянутых в конце ответа, клиент не заметит. - person phihag; 20.11.2015
comment
Относительно 2.) - как прокси узнает, для какого домена (CN) он должен выдать adhoc-сертификат? В рамках рукопожатия доменное имя еще не передается. - person Florian D.; 16.11.2018
comment
@ FlorianD. Таким же образом веб-сервер знает домен - SNI < / a>, поддерживается всеми современными браузерами. - person phihag; 16.11.2018
comment
Я не думаю, что наличие HTTPS-соединений через прокси-серверы означает атаку типа «Человек посередине» прокси-сервера. Я думаю, он спрашивает, можно ли подключиться к прокси-серверу http через TLS. И ответ - да. Ознакомьтесь с моим ответом на этот вопрос для получения более подробной информации. Этот ответ меня ввел в заблуждение, когда я искал соответствующие материалы в сети. Кстати, это первый результат поиска в Google :-). - person Rick; 12.07.2019
comment
@Rick Вопрос касается HTTPS-соединений через прокси. Чтобы подключить к прокси, вы, конечно, можете использовать любой протокол, который поддерживает сам прокси, включая TLS. - person phihag; 12.07.2019

Короткий ответ: это возможно и может быть выполнено с помощью специального HTTP-прокси или SOCKS-прокси.

Прежде всего, HTTPS использует SSL / TLS, который по своей конструкции обеспечивает сквозную безопасность, устанавливая безопасный канал связи поверх небезопасного. Если прокси-сервер HTTP может видеть содержимое, значит, это перехватчик «человек посередине», и это противоречит цели SSL / TLS. Так что должны быть какие-то уловки, если мы хотим прокси через простой HTTP-прокси.

Хитрость в том, что мы превращаем HTTP-прокси в TCP-прокси с помощью специальной команды CONNECT . Не все HTTP-прокси поддерживают эту функцию, но многие поддерживают ее сейчас. Прокси-сервер TCP не может видеть передаваемое HTTP-содержимое в виде открытого текста, но это не влияет на его способность пересылать пакеты туда и обратно. Таким образом, клиент и сервер могут общаться друг с другом с помощью прокси. Это безопасный способ проксирования данных HTTPS.

Существует также небезопасный способ сделать это, при котором HTTP-прокси становится посредником. Он получает инициированное клиентом соединение, а затем инициирует другое соединение с реальным сервером. В хорошо реализованном SSL / TLS клиент будет уведомлен о том, что прокси не является настоящим сервером. Таким образом, клиент должен доверять прокси, игнорируя предупреждение, чтобы все работало. После этого прокси просто расшифровывает данные из одного соединения, повторно шифрует и передает их в другое.

Наконец, мы определенно можем прокси HTTPS через прокси SOCKS, потому что прокси SOCKS работает на более низком уровне. . Вы можете рассматривать прокси-сервер SOCKS как прокси TCP и UDP.

person Cyker    schedule 30.11.2016
comment
Будет ли использование CONNECT вызывать предупреждения системы безопасности, как указано в stackoverflow.com/a/3118759/632951? - person Pacerier; 25.10.2017
comment
@Pacerier Я так не думаю. В режиме CONNECT прокси работает на транспортном уровне. - person Cyker; 06.11.2017
comment
Итак, с помощью метода CONNECT любые данные https от клиента не передаются на уровень приложения промежуточного прокси? И просто оценивается на уровне TCP прокси и напрямую передается на удаленный сервер? - person zzinny; 21.10.2019
comment
@zzinny Запрос TCP CONNECT используется только для открытия TCP-соединения через прокси-сервер с запрошенным веб-сервером. Прокси-сервер занимается только транспортным уровнем (TCP-соединение) и не касается PDU более высоких уровней. - person dombg; 25.02.2021

насколько я помню, вам нужно использовать HTTP-запрос CONNECT на прокси. это преобразует соединение запроса в прозрачный туннель TCP / IP.

поэтому вам нужно знать, поддерживает ли используемый вами прокси-сервер этот протокол.

person chburd    schedule 05.02.2009
comment
Действительно, клиенты используют команду CONNECT для использования https: // URI через прокси-серверы HTTP. В этом случае соединение туннелируется через прокси, поэтому проверка сертификата выполняется как обычно, как если бы клиент разговаривал напрямую с конечным сервером. - person Bruno; 06.07.2010
comment
@chburd, а обычно прокси поддерживают HTTP CONNECT? - person Pacerier; 25.10.2017

Если это все еще интересно, вот ответ на аналогичный вопрос: Преобразование прокси HTTP в прокси HTTPS в Twisted

Чтобы ответить на вторую часть вопроса:

Если да, то какой прокси-сервер позволяет это?

По умолчанию большинство прокси-серверов будут настроены так, чтобы разрешать HTTPS-соединения только с портом 443, поэтому https-URI с настраиваемыми портами работать не будут. Обычно это настраивается в зависимости от прокси-сервера. Например, Squid и TinyProxy поддерживают это.

person Bruno    schedule 06.07.2010

Вот мой полный код Java, который поддерживает запросы HTTP и HTTPS с использованием прокси-сервера SOCKS.

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

import org.apache.http.HttpHost;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;

import javax.net.ssl.SSLContext;

/**
 * How to send a HTTP or HTTPS request via SOCKS proxy.
 */
public class ClientExecuteSOCKS {

    public static void main(String[] args) throws Exception {
        Registry<ConnectionSocketFactory> reg = RegistryBuilder.<ConnectionSocketFactory>create()
            .register("http", new MyHTTPConnectionSocketFactory())
            .register("https", new MyHTTPSConnectionSocketFactory(SSLContexts.createSystemDefault
                ()))
            .build();
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(reg);
        try (CloseableHttpClient httpclient = HttpClients.custom()
            .setConnectionManager(cm)
            .build()) {
            InetSocketAddress socksaddr = new InetSocketAddress("mysockshost", 1234);
            HttpClientContext context = HttpClientContext.create();
            context.setAttribute("socks.address", socksaddr);

            HttpHost target = new HttpHost("www.example.com/", 80, "http");
            HttpGet request = new HttpGet("/");

            System.out.println("Executing request " + request + " to " + target + " via SOCKS " +
                "proxy " + socksaddr);
            try (CloseableHttpResponse response = httpclient.execute(target, request, context)) {
                System.out.println("----------------------------------------");
                System.out.println(response.getStatusLine());
                System.out.println(EntityUtils.toString(response.getEntity(), StandardCharsets
                    .UTF_8));
            }
        }
    }

    static class MyHTTPConnectionSocketFactory extends PlainConnectionSocketFactory {
        @Override
        public Socket createSocket(final HttpContext context) throws IOException {
            InetSocketAddress socksaddr = (InetSocketAddress) context.getAttribute("socks.address");
            Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr);
            return new Socket(proxy);
        }
    }

    static class MyHTTPSConnectionSocketFactory extends SSLConnectionSocketFactory {
        public MyHTTPSConnectionSocketFactory(final SSLContext sslContext) {
            super(sslContext);
        }

        @Override
        public Socket createSocket(final HttpContext context) throws IOException {
            InetSocketAddress socksaddr = (InetSocketAddress) context.getAttribute("socks.address");
            Proxy proxy = new Proxy(Proxy.Type.SOCKS, socksaddr);
            return new Socket(proxy);
        }
    }
}
person soulmachine    schedule 03.09.2015

Вы можете добиться этого, используя технику «человек посередине» с динамической генерацией SSL. Взгляните на mitmproxy - это прокси-сервер MITM на базе Python с поддержкой SSL.

person Zorayr    schedule 06.06.2013

туннелирование HTTPS через SSH (версия для Linux):

1) turn off using 443 on localhost
2) start tunneling as root: ssh -N login@proxy_server -L 443:target_ip:443
3) adding 127.0.0.1 target_domain.com to /etc/hosts

все, что вы делаете на localhost. тогда:

target_domain.com is accessible from localhost browser.
person Sławomir Lenart    schedule 01.12.2014

Я не думаю, что «иметь HTTPS-соединения через прокси-серверы» означает атаку типа «человек посередине» прокси-сервера. Я думаю, он спрашивает, можно ли подключиться к прокси-серверу http через TLS. И ответ - да.


Возможно ли подключение HTTPS через прокси-серверы?

Да, см. Мой вопрос и ответ здесь. Прокси-сервер HTTP работает только в SwitchOmega

Если да, то какой прокси-сервер позволяет это?

Прокси-сервер использует SSL-сертификаты, как и обычные веб-сайты. Но вам нужен pac файл для браузера, чтобы настроить прокси-соединение через SSL.

person Rick    schedule 12.07.2019

Я пробовал

  • начать туннелирование: ssh -N -D 12345 login@proxy_server
  • Setting the proxy in the firefox settings as localhost:12345
    • and ticking "use this proxy for all protocols"

но это приводило к ошибке «Небезопасное соединение» всякий раз, когда я пытался подключиться к веб-сайту https.

Решение было

  • "снимите отметку" с "использовать этот прокси для всех протоколов"
  • установите прокси "localhost: 12345" только как прокси SOCKS
  • и оставьте поля HTTP-прокси, SSL-прокси, FTP-прокси пустыми.

Ссылка из цифровой документации по океану

Как безопасно направлять веб-трафик без VPN с помощью туннеля SOCKS

person Shadi    schedule 14.09.2017