Para ssl::stream<tcp::socket> através de um proxy HTTP comum, use primeiro o transporte bruto e só depois peça a ele o TLS de destino:

auto& transport = tlsStream.next_layer();
  1. Conecte esse transporte ao host e à porta do proxy. Quando o destino HTTPS público é permitido e não há credenciais de proxy configuradas, a lista de proxies HTTP oferece endpoints candidatos; verifique se o candidato permite o túnel solicitado.
  2. Envie CONNECT indicando a authority do destino, como api.example:443, e analise os cabeçalhos completos da resposta no transporte simples. Um 2xx bem-sucedido abre o túnel; uma recusa continua sendo uma resposta do proxy HTTP.
  3. Configure o nome do host de destino, o SNI necessário, as raízes de confiança e a verificação do peer e, em seguida, inicie o handshake do cliente em tlsStream.
  4. Depois que o TLS funcionar, use leituras e gravações no fluxo SSL para a aplicação. Ler a camada inferior diretamente nesse ponto ignora o processamento de TLS.

Leve qualquer sobra do analisador HTTP para o próximo estágio. O Asio tem sobrecargas de handshake com buffer; descartar a cauda pertencente ao analisador pode perder bytes já lidos do socket.

Neste tipo simples, next_layer e lowest_layer chegam ambas ao TCP. Mais camadas de envoltório podem torná-las diferentes, então escolha a interface que carrega o protocolo real do proxy. Um proxy HTTPS acrescenta outro estágio TLS e fica fora desta sequência CONNECT em texto claro.

Artigos relacionados