web-dev-qa-db-fra.com

Connexions HTTPS sur des serveurs proxy

Est-il possible d'avoir des connexions HTTPS sur des serveurs proxy? Si oui, quel type de serveur proxy permet cela?

Dupliqué avec Comment utiliser le proxy Socks 5 avec Apache HTTP Client 4?

84
Elz

TLS/SSL (The S in HTTPS) garantit qu’il n’y a pas d’écoute indiscrète entre vous et le serveur que vous contactez, c’est-à-dire qu’il n’ya pas de mandataire. Normalement, vous utilisez CONNECT pour ouvrir une connexion TCP via le proxy. Dans ce cas, le proxy ne pourra pas mettre en cache, lire , ou modifier les demandes/réponses, et donc être plutôt inutile.

Si vous souhaitez que le proxy puisse lire des informations, vous pouvez adopter l'approche suivante:

  1. Le client démarre la session HTTPS
  2. Le proxy intercepte de manière transparente la connexion et retourne un certificat généré ad hoc (éventuellement faible) Kune, signé par une autorité de certification de confiance inconditionnelle du client.
  3. Le proxy démarre la session HTTPS sur la cible
  4. Le proxy vérifie l'intégrité du certificat SSL; affiche une erreur si le certificat n'est pas valide.
  5. Le proxy diffuse le contenu, le déchiffre et le rechiffre avec Kune
  6. Client affiche des choses

Un exemple est le Squid SSL bump . De même, burp peut être configuré pour le faire. Cela a également été tilisé dans un contexte moins bénin par un FAI égyptien .

Notez que les sites Web et les navigateurs modernes peuvent utiliser HPKP ou broches de certificat intégrées qui contrecarrent cette approche.

52
phihag

La réponse courte est: C'est possible et cela peut être fait avec un proxy HTTP spécial ou un proxy SOCKS.

Tout d’abord, HTTPS utilise SSL/TLS qui, de par sa conception, garantit une sécurité de bout en bout en établissant un canal de communication sécurisé sur un canal non sécurisé. Si le proxy HTTP est capable de voir le contenu, il s'agit alors d'une oreille indiscrète, ce qui va à l'encontre de l'objectif de SSL/TLS. Il doit donc y avoir quelques astuces pour pouvoir utiliser un proxy HTTP simple.

Le truc, c’est que nous transformons un proxy HTTP en un TCP proxy avec une commande spéciale nommée CONNECT . Tous les proxies HTTP ne supportent pas cette fonctionnalité, mais beaucoup Le proxy TCP ne peut pas voir le contenu HTTP transféré en texte clair, mais cela n’affecte pas sa capacité à transférer les paquets en avant et en arrière. De cette manière, le client et le serveur peuvent communiquer Le moyen le plus sûr de transmettre des données HTTPS par proxy est utilisé.

Il existe également un moyen peu sûr de le faire, dans lequel le proxy HTTP devient un homme du milieu. Il reçoit la connexion lancée par le client, puis initie une autre connexion au serveur réel. Dans un protocole SSL/TLS bien implémenté, le client sera averti que le proxy n'est pas le serveur réel. Le client doit donc faire confiance au proxy en ignorant l'avertissement pour que les choses fonctionnent. Après cela, le proxy décrypte simplement les données d’une connexion, les recrypte et les transfère à l’autre.

Enfin, nous pouvons certainement proxy HTTPS via un proxy SOCKS , car le proxy SOCKS fonctionne à un niveau inférieur. Vous pouvez penser qu'un proxy SOCKS est à la fois un proxy TCP et un proxy UDP).

15
Cyker

pour autant que je me souvienne, vous devez utiliser une requête HTTP CONNECT sur le proxy. cela convertira la connexion de demande en un tunnel TCP/IP transparent.

vous devez donc savoir si le serveur proxy que vous utilisez prend en charge ce protocole.

14
chburd

Si cela vous intéresse toujours, voici une réponse à une question similaire: Conversion du proxy HTTP en proxy HTTPS dans Twisted

Pour répondre à la deuxième partie de la question:

Si oui, quel type de serveur proxy permet cela?

En sortie d'usine, la plupart des serveurs proxy seront configurés pour autoriser les connexions HTTPS uniquement sur le port 443, afin que les URI https avec des ports personnalisés ne fonctionnent pas. Ceci est généralement configurable, en fonction du serveur proxy. Squid et TinyProxy le supportent, par exemple.

9
Bruno

Voici mon code Java complet qui prend en charge les requêtes HTTP et HTTPS à l'aide d'un proxy 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);
        }
    }
}
5
soulmachine

tunneling HTTPS via SSH (version 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

tout ce que vous faites sur localhost. ensuite:

target_domain.com is accessible from localhost browser.
2
Sławomir Lenart

Vous pouvez accomplir cela en utilisant des techniques d'intermédiaire avec la génération SSL dynamique. Jetez un oeil à mitmproxy - c'est un proxy MITM basé sur Python et compatible SSL.

2
Zorayr

Je ne pense pas que "avoir des connexions HTTPS sur des serveurs proxy" signifie le type de serveur proxy de type attaque de type Man-in-the-Middle. Je pense que cela demande si on peut se connecter à un serveur proxy http via TLS. Et la réponse est oui.


Est-il possible d'avoir des connexions HTTPS sur des serveurs proxy?

Oui, voir ma question et répondre ici. Le serveur proxy HTTP ne fonctionne que dans SwitchOmega

Si oui, quel type de serveur proxy permet cela?

Le type de serveur proxy déploie des certificats SSL, comme le font les sites Web ordinaires. Mais vous avez besoin d'un fichier pac pour que le navigateur puisse configurer la connexion proxy via SSL.

1
Rick

J'avais essayé

  • commencer le tunneling: ssh -N -D 12345 login@proxy_server
  • Définir le proxy dans les paramètres de Firefox comme localhost:12345
    • et en cochant "utilise ce proxy pour tous les protocoles"

mais cela entraînait l'erreur "Connexion non sécurisée" chaque fois que j'essayais de me connecter à un site Web https.

La solution était de

  • "décochez" le "utiliser ce proxy pour tous les protocoles"
  • définir le proxy "localhost: 12345" uniquement en tant que proxy SOCKS
  • et laissez le proxy HTTP, proxy SSL, proxy FTP vide

Référence de la documentation de Digital Ocean

Comment acheminer le trafic Web en toute sécurité sans VPN à l'aide d'un tunnel SOCKS

1
shadi