web-dev-qa-db-de.com

HTTPS-Verbindungen über Proxy-Server

Ist es möglich, HTTPS-Verbindungen über Proxy-Server herzustellen? Wenn ja, welche Art von Proxy-Server erlaubt dies?

Dupliziert mit Wie verwende ich Socks 5-Proxy mit Apache HTTP Client 4?

84
Elz

TLS/SSL (das S in HTTPS) garantiert, dass zwischen Ihnen und dem Server, mit dem Sie Kontakt aufnehmen, keine Lauschangriffe stattfinden, d. H. Keine Proxys. Normalerweise verwenden Sie CONNECT , um eine TCP) - Verbindung über den Proxy herzustellen. In diesem Fall kann der Proxy keine Leseoperationen zwischenspeichern , oder ändere Anfragen/Antworten und sei daher eher nutzlos.

Wenn Sie möchten, dass der Proxy Informationen lesen kann, können Sie wie folgt vorgehen:

  1. Der Client startet die HTTPS-Sitzung
  2. Proxy fängt die Verbindung transparent ab und gibt ein Ad-hoc-generiertes (möglicherweise schwaches) Zertifikat K zurückein, signiert von einer Zertifizierungsstelle, die vom Client bedingungslos als vertrauenswürdig eingestuft wird.
  3. Der Proxy startet die HTTPS-Sitzung zum Ziel
  4. Der Proxy überprüft die Integrität des SSL-Zertifikats. Zeigt einen Fehler an, wenn das Zertifikat nicht gültig ist.
  5. Proxy streamt Inhalte, entschlüsselt sie und verschlüsselt sie erneut mit Kein
  6. Client zeigt Zeug

Ein Beispiel ist Squids SSL-Bump . Ebenso kann rülpsen kann konfiguriert werden um dies zu tun. Dies wurde auch in einem weniger gutartigen Kontext von einem ägyptischen ISP verwendet .

Beachten Sie, dass moderne Websites und Browser HPKP oder integrierte Zertifikatspins verwenden können, um diesen Ansatz zu umgehen.

52
phihag

Die kurze Antwort lautet: Es ist möglich und kann entweder mit einem speziellen HTTP-Proxy oder einem SOCKS-Proxy erfolgen.

In erster Linie verwendet HTTPS SSL/TLS, das durch die Einrichtung eines sicheren Kommunikationskanals über einen unsicheren Ende-zu-Ende-Sicherheit gewährleistet. Wenn der HTTP-Proxy den Inhalt sehen kann, handelt es sich um einen Man-in-the-Middle-Lauscher, der das Ziel von SSL/TLS übertrifft. Es müssen also einige Streiche gespielt werden, wenn wir über einen einfachen HTTP-Proxy Proxy-Verbindungen herstellen möchten.

Der Trick ist, dass wir einen HTTP-Proxy mit einem speziellen Befehl namens CONNECT in einen TCP) - Proxy verwandeln. Nicht alle HTTP-Proxys unterstützen diese Funktion, aber viele tun Sie dies jetzt. Der TCP Proxy kann den HTTP-Inhalt nicht im Klartext übertragen sehen, dies hat jedoch keine Auswirkung auf die Möglichkeit, Pakete hin und her weiterzuleiten. Auf diese Weise können Client und Server kommunizieren Mit Hilfe des Proxys können Sie auf sichere Weise HTTPS-Daten austauschen.

Es gibt auch eine unsichere Methode, bei der der HTTP-Proxy zum Man-in-the-Middle 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. Daher muss der Client dem Proxy vertrauen, indem er die Warnung ignoriert, damit alles funktioniert. Danach entschlüsselt der Proxy einfach Daten von einer Verbindung, verschlüsselt sie neu und leitet sie in die andere weiter.

Schließlich können wir HTTPS sicher ü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.

15
Cyker

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 Proxy-Server dieses Protokoll unterstützt.

14
chburd

Wenn es immer noch von Interesse ist, finden Sie hier eine Antwort auf eine ähnliche Frage: HTTP-Proxy in HTTPS-Proxy in Twisted konvertieren

So beantworten Sie den zweiten Teil der Frage:

Wenn ja, welche Art von Proxy-Server erlaubt dies?

Standardmäßig sind die meisten Proxyserver so konfiguriert, dass HTTPS-Verbindungen nur zu Port 443 zugelassen werden, sodass https-URIs mit benutzerdefinierten Ports nicht funktionieren. Dies ist in der Regel je nach Proxy-Server konfigurierbar. Dies wird beispielsweise von Squid und TinyProxy unterstützt.

9
Bruno

Hier ist mein vollständiger Java Code, der sowohl HTTP- als auch HTTPS-Anforderungen mit 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);
        }
    }
}
5
soulmachine

tunneling von HTTPS durch SSH (Linux-Version):

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

alles was du auf localhost machst. dann:

target_domain.com is accessible from localhost browser.
2

Sie können dies mithilfe von Man-in-the-Middle-Techniken mit dynamischer SSL-Generierung erreichen. Schauen Sie sich mitmproxy an - es ist ein auf Python basierender, SSL-fähiger MITM-Proxy.

2
Zorayr

Ich glaube nicht, dass "HTTPS-Verbindungen über Proxy-Server" den Man-in-the-Middle-Angriffstyp eines Proxy-Servers bedeutet. Ich denke, es fragt sich, ob man über TLS eine Verbindung zu einem HTTP-Proxy-Server herstellen kann. Und die Antwort lautet ja.


Ist es möglich, HTTPS-Verbindungen über Proxy-Server herzustellen?

Ja, meine Frage und Antwort finden Sie hier. HTTPs Proxy Server funktioniert nur in SwitchOmega

Wenn ja, welche Art von Proxy-Server 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.

1
Rick

Ich hatte es versucht

  • tunneling starten: ssh -N -D 12345 [email protected]_server
  • Proxy in den Firefox-Einstellungen einstellen als localhost:12345
    • und Häkchen bei "Diesen Proxy für alle Protokolle verwenden"

dies führte jedoch zu dem Fehler "Unsichere Verbindung", wenn ich versuchte, eine Verbindung zu einer https-Website herzustellen.

Die Lösung war zu

  • "Deaktivieren" Sie das Kontrollkästchen "Diesen Proxy für alle Protokolle verwenden".
  • setzen Sie den Proxy "localhost: 12345" nur als SOCKS-Proxy
  • und lassen Sie den HTTP-Proxy, den SSL-Proxy und den FTP-Proxy leer

Referenz aus der Dokumentation von Digital Ocean

So leiten Sie Webdatenverkehr ohne VPN mithilfe eines SOCKS-Tunnels sicher weiter

1
shadi