Como funcionam as conexões HTTPS através de servidores proxy: O método CONNECT

Como funcionam as conexões HTTPS através de servidores proxy: O método CONNECT


Ao usar um proxy HTTP para se conectar à rede, o servidor proxy encaminha as solicitações do cliente. No entanto, como o HTTPS requer primeiro um handshake TLS, o servidor proxy não pode encaminhar a solicitação diretamente e precisa estabelecer uma conexão primeiro.

Encaminhamento de solicitações HTTP via proxy

Os servidores proxy lidam com conexões HTTP (aquelas sem criptografia TLS) de forma bastante simples. Por exemplo, quando um cliente quer acessar example.com, ele envia esta solicitação:

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

Esta solicitação primeiro passa pelo servidor proxy. O proxy analisa a URL de destino e depois encaminha a solicitação completa. Após receber a resposta, ele a encaminha para o cliente.

Conexões HTTPS

Quando a criptografia TLS é adicionada, o problema se torna mais complexo. O servidor proxy não pode encaminhar diretamente a solicitação do cliente porque não pode estabelecer uma conexão TLS com o servidor em nome do cliente. Se o fizesse, o cliente detectaria erros no certificado TLS.

O método CONNECT resolve este problema. Como GET, é um método HTTP, mas é especificamente projetado para estabelecer conexões. É assim que funciona:

  1. O cliente envia uma solicitação CONNECT para o servidor proxy:

    CONNECT example.com:443 HTTP/1.1
    Host: example.com
    Proxy-Connection: keep-alive
  2. Após receber a solicitação, o servidor proxy estabelece uma conexão TCP com o servidor de destino e depois responde ao cliente:

    HTTP/1.1 200 Connection established

    O servidor proxy tipicamente não encaminha a solicitação CONNECT em si para o servidor de destino

  3. Depois disso, o servidor proxy se torna um túnel TCP transparente, encaminhando cegamente os pacotes TCP. Neste ponto, o cliente pode realizar o handshake TLS e transmitir dados HTTPS. Como os dados estão criptografados, o servidor proxy não pode ver nem modificar o conteúdo da comunicação.

    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

Do processo acima, podemos ver que o método CONNECT na verdade estabelece um túnel TCP e não é projetado especificamente para TLS. Portanto, qualquer solicitação TCP pode ser transmitida através deste túnel.

Os proxies de camada de transporte precisam do método CONNECT?

Para proxies que operam na camada de transporte (TCP/UDP), como proxies SOCKS5, o método CONNECT não é necessário. Isso é porque eles lidam diretamente com conexões TCP e UDP e não precisam entender protocolos de camada de aplicação (como HTTP).

Quando os clientes se conectam a sites HTTPS através desses proxies, o servidor proxy só precisa:

  • Receber a solicitação de conexão do cliente
  • Estabelecer uma conexão TCP com o servidor de destino
  • Fazer a ponte entre as duas conexões