Estabeleça o CONNECT antes de iniciar o handshake TLS do Asio
Use a camada inferior do fluxo SSL do Asio para a troca com um proxy HTTP comum e depois inicie o TLS pelo túnel aceito.
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();
- 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.
- 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. - 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. - 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.