Возможно ли иметь HTTPS-соединения через прокси-серверы? Если да, то какой прокси-сервер разрешает это?
Дублируется с помощью Как использовать прокси-сервер Socks 5 с Apache HTTP Client 4?
Возможно ли иметь HTTPS-соединения через прокси-серверы? Если да, то какой прокси-сервер разрешает это?
Дублируется с помощью Как использовать прокси-сервер Socks 5 с Apache HTTP Client 4?
 TLS/SSL (S в HTTPS) гарантирует, что между вами и сервером, с которым вы обращаетесь, нет перехватчиков, то есть прокси-серверов. Обычно вы используете  CONNECT чтобы открыть TCP-соединение через прокси. В этом случае прокси не сможет кэшировать, читать или изменять какие-либо запросы/ответы и, следовательно, будет бесполезным.
Если вы хотите, чтобы прокси мог читать информацию, вы можете воспользоваться следующим подходом:
Примером является Squid SSL Bump. Точно так же Burp может быть настроен для этого. Это также использовалось в менее благоприятном контексте египетским интернет-провайдером.
Обратите внимание, что современные веб-сайты и браузеры могут использовать HPKP или встроенные выводы сертификатов, которые побеждают этот подход.
насколько я помню, вам нужно использовать запрос HTTP CONNECT для прокси. это преобразует соединение запроса в прозрачный туннель TCP/IP.
поэтому вам нужно знать, поддерживает ли прокси-сервер этот протокол.
Короткий ответ: это возможно и может быть выполнено либо с помощью специального 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.
Если это все еще представляет интерес, вот ответ на аналогичный вопрос: Преобразование HTTP-прокси в HTTPS-прокси в Twisted
Чтобы ответить на вторую часть вопроса:
Если да, какой прокси-сервер позволяет это?
Исходя из этого, большинство прокси-серверов будут настроены так, чтобы разрешать HTTPS-подключения только к порту 443, поэтому https URI с пользовательскими портами не будут работать. Обычно это настраивается в зависимости от прокси-сервера. Например, Squid и TinyProxy поддерживают это.
Вот мой полный код 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);
        }
    }
}
		Вы можете выполнить это, используя методы "человек-в-середине" с динамическим генерированием SSL. Взгляните на mitmproxy - это прокси-сервер MITM, основанный на Python.
туннелирование HTTPS через SSH (версия Linux):
1) turn off using 443 on localhost
2) start tunneling as root: ssh -N [email protected]_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.
		Я пробовал
ssh -N -D 12345 [email protected]_serverlocalhost:12345
но это привело к ошибке "Незащищенное соединение" всякий раз, когда я пытался подключиться к веб-сайту https.
Решение было
Ссылка на документацию по цифровому океану
Как безопасно маршрутизировать веб-трафик без VPN с использованием туннеля SOCKS
Я не думаю, что "иметь HTTPS-соединение через прокси-серверы" означает тип прокси-сервера типа "человек посередине". Я думаю, что это спрашивает, можно ли подключиться к прокси-серверу http через TLS. И ответ - да.
Возможно ли иметь HTTPS-соединения через прокси-серверы?
Да, смотрите мой вопрос и ответ здесь. Прокси-сервер HTTP работает только в SwitchOmega
Если да, то какой прокси-сервер позволяет это?
 Тип прокси-сервера развертывает сертификаты SSL, как обычные веб-сайты. Но вам нужен pac файл для браузера, чтобы настроить прокси-соединение по SSL.