Cómo funcionan las conexiones HTTPS a través de servidores proxy: El método CONNECT

Cómo funcionan las conexiones HTTPS a través de servidores proxy: El método CONNECT


Cuando se utiliza un proxy HTTP para conectarse a la red, el servidor proxy reenvía las solicitudes del cliente. Sin embargo, como HTTPS requiere primero un handshake TLS, el servidor proxy no puede reenviar la solicitud directamente y necesita establecer una conexión primero.

Reenvío de solicitudes HTTP a través de proxy

Los servidores proxy manejan las conexiones HTTP (aquellas sin cifrado TLS) de manera bastante simple. Por ejemplo, cuando un cliente quiere acceder a example.com, envía esta solicitud:

GET http://example.com/index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Proxy-Connection: keep-alive

Esta solicitud primero pasa por el servidor proxy. El proxy analiza la URL de destino y luego reenvía la solicitud completa. Después de recibir la respuesta, la reenvía al cliente.

Conexiones HTTPS

Cuando se agrega el cifrado TLS, el problema se vuelve más complejo. El servidor proxy no puede reenviar directamente la solicitud del cliente porque no puede establecer una conexión TLS con el servidor en nombre del cliente. Si lo hiciera, el cliente detectaría errores en el certificado TLS.

El método CONNECT resuelve este problema. Como GET, es un método HTTP, pero está específicamente diseñado para establecer conexiones. Así es como funciona:

  1. El cliente envía una solicitud CONNECT al servidor proxy:

    CONNECT example.com:443 HTTP/1.1
    Host: example.com
    Proxy-Connection: keep-alive
  2. Después de recibir la solicitud, el servidor proxy establece una conexión TCP con el servidor de destino y luego responde al cliente:

    HTTP/1.1 200 Connection established

    El servidor proxy típicamente no reenvía la solicitud CONNECT en sí al servidor de destino

  3. Después de esto, el servidor proxy se convierte en un túnel TCP transparente, reenviando ciegamente los paquetes TCP. En este punto, el cliente puede realizar el handshake TLS y transmitir datos HTTPS. Como los datos están cifrados, el servidor proxy no puede ver ni modificar el contenido de la comunicación.

    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

Del proceso anterior, podemos ver que el método CONNECT en realidad establece un túnel TCP y no está diseñado específicamente para TLS. Por lo tanto, cualquier solicitud TCP puede transmitirse a través de este túnel.

¿Los proxies de capa de transporte necesitan el método CONNECT?

Para los proxies que funcionan en la capa de transporte (TCP/UDP), como los proxies SOCKS5, no se necesita el método CONNECT. Esto es porque manejan directamente las conexiones TCP y UDP y no necesitan entender protocolos de capa de aplicación (como HTTP).

Cuando los clientes se conectan a sitios web HTTPS a través de estos proxies, el servidor proxy solo necesita:

  • Recibir la solicitud de conexión del cliente
  • Establecer una conexión TCP con el servidor de destino
  • Puentear las dos conexiones