Establezca CONNECT antes de iniciar el handshake TLS de Asio
Use la capa siguiente de un flujo SSL de Asio para el intercambio HTTP sin cifrar a través del proxy y luego inicie TLS por el túnel aceptado.
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();- 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.
- 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. - 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. - 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.