Ist es möglich, HTTPS-Verbindungen über Proxyserver herzustellen? Wenn ja, welche Art von Proxyserver erlaubt dies?
Dupliziert mit Wie verwende ich den Socks 5-Proxy mit Apache HTTP Client 4?
Ist es möglich, HTTPS-Verbindungen über Proxyserver herzustellen? Wenn ja, welche Art von Proxyserver erlaubt dies?
Dupliziert mit Wie verwende ich den Socks 5-Proxy mit Apache HTTP Client 4?
Antworten:
TLS / SSL (The S in HTTPS) garantiert, dass sich zwischen Ihnen und dem Server, den Sie kontaktieren, keine Lauscher befinden, dh keine Proxys. Normalerweise CONNECT
öffnen Sie eine TCP-Verbindung über den Proxy. In diesem Fall kann der Proxy keine Anforderungen / Antworten zwischenspeichern, lesen oder ändern und ist daher eher nutzlos.
Wenn der Proxy Informationen lesen soll, können Sie folgendermaßen vorgehen:
Ein Beispiel ist Squids SSL-Bump . Ebenso kann Burp dafür konfiguriert werden . Dies wurde auch in einem weniger harmlosen Kontext von einem ägyptischen ISP verwendet .
Beachten Sie, dass moderne Websites und Browser HPKP oder integrierte Zertifikat-Pins verwenden können, die diesen Ansatz zunichte machen .
Unconditionally trusted
bezieht sich auf ein CA-Zertifikat. CA-Zertifikate haben keine Domänen. Ich habe die Antwort mit zwei Beispielen geändert, in denen dies in der Praxis ohne Warnungen an den Benutzer funktioniert / funktioniert hat.
Die kurze Antwort lautet: Es ist möglich und kann entweder mit einem speziellen HTTP-Proxy oder einem SOCKS-Proxy durchgeführt werden.
In erster Linie verwendet HTTPS SSL / TLS, das die End-to-End-Sicherheit gewährleistet, indem ein sicherer Kommunikationskanal über einen unsicheren eingerichtet wird. Wenn der HTTP-Proxy den Inhalt sehen kann, handelt es sich um einen Lauscher, der das Ziel von SSL / TLS verfehlt. Es müssen also einige Tricks gespielt werden, wenn wir einen Proxy über einen einfachen HTTP-Proxy durchführen möchten.
Der Trick ist, wir verwandeln einen HTTP-Proxy in einen TCP-Proxy mit einem speziellen Befehl namens CONNECT
. Nicht alle HTTP-Proxys unterstützen diese Funktion, aber viele tun dies jetzt. Der TCP-Proxy kann den übertragenen HTTP-Inhalt nicht im Klartext sehen, dies hat jedoch keine Auswirkungen auf seine Fähigkeit, Pakete hin und her weiterzuleiten. Auf diese Weise können Client und Server mithilfe des Proxys miteinander kommunizieren. Dies ist die sichere Methode zum Proxying von HTTPS-Daten.
Es gibt auch eine unsichere Methode, bei der der HTTP-Proxy zu einem Mann in der Mitte wird. Es empfängt die vom Client initiierte Verbindung und initiiert dann eine weitere Verbindung zum realen Server. In einem gut implementierten SSL / TLS wird der Client benachrichtigt, dass der Proxy nicht der echte Server ist. Der Client muss dem Proxy also vertrauen, indem er die Warnung ignoriert, damit die Dinge funktionieren. Danach entschlüsselt der Proxy einfach Daten von einer Verbindung, verschlüsselt sie erneut und speist sie in die andere ein.
Schließlich können wir HTTPS sicherlich über einen SOCKS- Proxy vertreten, da der SOCKS-Proxy auf einer niedrigeren Ebene arbeitet. Sie können sich einen SOCKS-Proxy sowohl als TCP- als auch als UDP-Proxy vorstellen.
Soweit ich mich erinnern kann, müssen Sie eine HTTP CONNECT-Abfrage auf dem Proxy verwenden. Dadurch wird die Anforderungsverbindung in einen transparenten TCP / IP-Tunnel konvertiert.
Sie müssen also wissen, ob der von Ihnen verwendete Proxyserver dieses Protokoll unterstützt.
Wenn es immer noch von Interesse ist, finden Sie hier eine Antwort auf eine ähnliche Frage: Konvertieren Sie den HTTP-Proxy in Twisted in den HTTPS-Proxy
Um den zweiten Teil der Frage zu beantworten:
Wenn ja, welche Art von Proxyserver erlaubt dies?
Standardmäßig werden die meisten Proxyserver so konfiguriert, dass HTTPS-Verbindungen nur zu Port 443 zugelassen werden, sodass https-URIs mit benutzerdefinierten Ports nicht funktionieren. Dies ist im Allgemeinen abhängig vom Proxyserver konfigurierbar. Squid und TinyProxy unterstützen dies beispielsweise.
Hier ist mein vollständiger Java-Code, der sowohl HTTP- als auch HTTPS-Anforderungen mit dem SOCKS-Proxy unterstützt.
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);
}
}
}
Sie können dies mithilfe von Man-in-the-Middle-Techniken mit dynamischer SSL-Generierung erreichen. Schauen Sie sich mitmproxy an - es ist ein Python-basierter, SSL-fähiger MITM-Proxy.
Tunneln von HTTPS über SSH (Linux-Version):
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
alles was du auf localhost machst. dann:
target_domain.com is accessible from localhost browser.
Ich hatte es versucht
ssh -N -D 12345 login@proxy_server
localhost:12345
Dies führte jedoch zu dem Fehler "Unsichere Verbindung", wenn ich versuchte, eine Verbindung zu einer https-Website herzustellen.
Die Lösung war zu
Referenz aus der digitalen Ozeandokumentation
So leiten Sie den Webverkehr ohne VPN mithilfe eines SOCKS-Tunnels sicher weiter
Ich glaube nicht, dass "HTTPS-Verbindungen über Proxyserver haben" den Man-in-the-Middle-Angriffstyp eines Proxyservers bedeutet. Ich denke, es wird gefragt, ob man über TLS eine Verbindung zu einem http-Proxyserver herstellen kann. Und die Antwort lautet ja.
Ist es möglich, HTTPS-Verbindungen über Proxyserver herzustellen?
Ja, siehe meine Frage und Antwort hier. Der HTTP-Proxyserver funktioniert nur in SwitchOmega
Wenn ja, welche Art von Proxyserver erlaubt dies?
Die Art des Proxyservers stellt SSL-Zertifikate bereit, wie dies bei normalen Websites der Fall ist. Sie benötigen jedoch eine pac
Datei, damit der Browser die Proxy-Verbindung über SSL konfigurieren kann.