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?
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:
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.
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).
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.
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.
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);
}
}
}
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.
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.
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.
J'avais essayé
ssh -N -D 12345 login@proxy_server
localhost:12345
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
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