Comment les connexions HTTPS passent par un serveur proxy : la méthode CONNECT

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 :

  1. Le client envoie une requête CONNECT au serveur proxy :

    CONNECT example.com:443 HTTP/1.1
    Host: example.com
    Proxy-Connection: keep-alive
  2. 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

  3. 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