
Comment les connexions HTTPS passent par un serveur proxy : la méthode CONNECT
Lors de l’utilisation d’un proxy HTTP pour se connecter au réseau, le serveur proxy transmet les requêtes du client. Cependant, comme HTTPS nécessite d’abord une poignée de main TLS, le serveur proxy ne peut pas transmettre directement les requêtes et doit d’abord établir une connexion.
Transmission des requêtes par proxy HTTP
Le traitement des connexions HTTP (non chiffrées par TLS) par le serveur proxy est simple. Par exemple, si un client veut accéder à example.com, il enverra cette requête :
GET http://example.com/index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Proxy-Connection: keep-alive
Cette requête passera d’abord par le serveur proxy. Le proxy analysera l’URL cible, puis transmettra cette requête complète. Après avoir reçu la réponse, il la transmettra au client.
Connexion HTTPS
Lorsque TLS est ajouté pour le chiffrement, le problème devient plus complexe. Le serveur proxy ne peut pas transmettre directement les requêtes du client car il ne peut pas remplacer le client pour établir une connexion TLS avec le serveur. Si c’était le cas, le client détecterait une erreur de certificat TLS.
La méthode CONNECT résout ce problème. C’est une méthode HTTP comme GET, mais elle ne sert qu’à établir une connexion. Le processus de travail est le suivant :
-
Le client envoie une requête CONNECT au serveur proxy :
CONNECT example.com:443 HTTP/1.1 Host: example.com Proxy-Connection: keep-alive
-
Après avoir reçu la requête, le serveur proxy établit une connexion TCP avec le serveur cible, puis répond au client :
HTTP/1.1 200 Connection established
Le serveur proxy ne transmet généralement pas la requête CONNECT elle-même au serveur cible
-
Ensuite, le serveur proxy devient un tunnel TCP transparent, transmettant aveuglément les paquets TCP. À ce moment, le client peut effectuer la poignée de main TLS et transmettre les données HTTPS. Comme les données sont chiffrées, le serveur proxy ne peut pas voir ou modifier le contenu de la communication.
sequenceDiagram participant Client participant Proxy participant Server Client->>Proxy: CONNECT example.com:443 Proxy->>Server: TCP Connection Server->>Proxy: Connection Established Proxy->>Client: HTTP/1.1 200 Connection established Note over Client,Server: TLS Handshake Note over Client,Server: Encrypted Communication
D’après le processus ci-dessus, on peut voir que la méthode CONNECT établit en fait un tunnel TCP et n’est pas conçue spécifiquement pour TLS. Donc en fait, n’importe quelle requête TCP peut être transmise par ce tunnel.
Les proxies de couche de transport ont-ils besoin de la méthode CONNECT
Pour les proxies qui fonctionnent au niveau de la couche de transport (TCP/UDP), comme les proxies SOCKS5, la méthode CONNECT n’est pas nécessaire. Car ils gèrent directement les connexions TCP et UDP sans avoir besoin de comprendre les protocoles de couche application (comme HTTP).
Lorsqu’un client se connecte à un site HTTPS via ces proxies, le serveur proxy n’a besoin que de :
- Recevoir la requête de connexion du client
- Établir une connexion TCP avec le serveur cible
- Relier les deux connexions