Para ssl::stream<tcp::socket> a través de un proxy HTTP normal, use su transporte sin procesar antes de pedirle que realice TLS hacia el destino:

auto& transport = tlsStream.next_layer();
  1. Conecte ese transporte al host y al puerto del proxy. Para un destino HTTPS público permitido sin credenciales de proxy configuradas, la lista de proxies HTTP ofrece extremos candidatos; compruebe que el candidato permita el túnel solicitado.
  2. Envíe CONNECT indicando la autoridad del destino, como api.example:443, y analice las cabeceras completas de la respuesta en el transporte sin cifrar. Un 2xx correcto abre el túnel; una negativa sigue siendo una respuesta del proxy HTTP.
  3. Configure el nombre de host del destino, el SNI requerido, las raíces de confianza y la verificación del par, y luego inicie el handshake del cliente en tlsStream.
  4. Cuando TLS tenga éxito, use lecturas y escrituras del flujo SSL para la aplicación. Leer la capa siguiente directamente en ese momento omite el procesamiento TLS.

Lleve cualquier sobrante del analizador HTTP a la etapa siguiente. Asio tiene sobrecargas de handshake con búfer; descartar una cola propiedad del analizador puede perder bytes ya leídos del socket.

Con este tipo sencillo, next_layer y lowest_layer llegan ambos a TCP. Más envoltorios pueden hacerlos distintos, así que elija la interfaz que lleva el protocolo de cable real del proxy. Un proxy HTTPS añade otra etapa TLS y queda fuera de esta secuencia CONNECT en texto plano.

Artículos relacionados