Чи можливе з'єднання HTTPS через проксі-сервери? Якщо так, то який проксі-сервер дозволяє це?
Дублюється із способом використання проксі-сервера Socks 5 з Apache HTTP Client 4?
Чи можливе з'єднання HTTPS через проксі-сервери? Якщо так, то який проксі-сервер дозволяє це?
Дублюється із способом використання проксі-сервера Socks 5 з Apache HTTP Client 4?
Відповіді:
TLS / SSL (S в HTTPS) гарантує, що між вами та сервером, до якого ви контактуєте, немає прослуховувачів, тобто немає проксі. Зазвичай ви використовуєте CONNECT
для відкриття TCP-з'єднання через проксі. У цьому випадку проксі не зможе кешувати, читати чи змінювати будь-які запити / відповіді, а отже, буде досить марним.
Якщо ви хочете, щоб проксі-сервер міг читати інформацію, ви можете скористатися наступним підходом:
Прикладом є SSL-удари кальмарів . Аналогічно, для цього можна налаштувати відрижку . Це також використовувало єгипетський Інтернет-провайдер у менш доброякісному контексті .
Зауважте, що сучасні веб-сайти та веб-переглядачі можуть використовувати HPKP або вбудовані шпильки сертифікатів, які заперечують такий підхід.
Unconditionally trusted
посилається на сертифікат CA. Сертифікати CA не мають доменів. Я змінив відповідь на двох прикладах, коли це працює / робиться на практиці без будь-яких сповіщень користувача.
Коротка відповідь: Це можливо, і це можна зробити за допомогою спеціального проксі 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 CONNECT на проксі. це перетворить з'єднання запиту в прозорий TCP / IP тунель.
тому вам потрібно знати, чи підтримує проксі-сервер, який ви використовуєте, цей протокол.
Якщо це все ще цікавить, ось відповідь на аналогічне запитання: Перетворити HTTP-проксі в HTTPS-проксі у скрученому вигляді
Щоб відповісти на другу частину питання:
Якщо так, то який проксі-сервер дозволяє це?
У вікні більшості проксі-серверів буде налаштовано так, щоб дозволити HTTPS-з’єднання лише до порту 443, тому https URI з користувацькими портами не працюватиме. Це, як правило, настроюється, залежно від проксі-сервера. Скажімо, це підтримують кальмари та 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);
}
}
}
тунелювання 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.
Я намагався
ssh -N -D 12345 login@proxy_server
localhost:12345
але це призвело до помилки "Небезпечне з'єднання" кожного разу, коли я намагався підключитися до веб-сайту https.
Рішенням було до
Довідка з цифрової океанічної документації
Як безпечно маршрутизувати веб-трафік без VPN, використовуючи тунель SOCKS
Я не думаю, що "мати з'єднання HTTPS через проксі-сервери" означає проксі-сервер типу атаки Man-in-the-Middle. Я думаю, що це питання, чи можна підключитися до проксі-сервера http через TLS. І відповідь - так.
Чи можливе з'єднання HTTPS через проксі-сервери?
Так, дивіться моє запитання та відповідь тут. Проксі-сервер HTTPs працює лише в SwitchOmega
Якщо так, то який проксі-сервер дозволяє це?
Проксі-сервер використовує SSL-сертифікати, як, наприклад, звичайні веб-сайти. Але вам потрібен pac
файл для браузера, щоб налаштувати проксі-з'єднання через SSL.