Voor ssl::stream<tcp::socket> via een gewone HTTP-proxy gebruikt u het onbewerkte transport voordat u er TLS naar de bestemming van vraagt:

auto& transport = tlsStream.next_layer();
  1. Verbind dat transport met de host en poort van de proxy. Voor een toegestaan openbaar HTTPS-doel zonder ingestelde proxyreferenties biedt de HTTP-proxylijst kandidaat-eindpunten; controleer of de kandidaat de gevraagde tunnel toestaat.
  2. Stuur CONNECT met de authority van het doel, bijvoorbeeld api.example:443, en analyseer de volledige responsheaders op het onbewerkte transport. Een geslaagde 2xx opent de tunnel; een weigering blijft een HTTP-proxyrespons.
  3. Configureer de hostnaam van het doel, de vereiste SNI, vertrouwenswortels en peer-verificatie en start dan de clienthandshake op tlsStream.
  4. Gebruik na een geslaagde TLS de lees- en schrijfbewerkingen van de SSL-stream voor de toepassing. De volgende laag op dat moment rechtstreeks lezen omzeilt TLS-verwerking.

Neem eventueel overschot van de HTTP-parser mee naar de volgende fase. Asio heeft overbelastingen voor gebufferde handshakes; het weggooien van een staart die de parser bezit kan bytes verliezen die al uit de socket zijn gelezen.

Met dit eenvoudige type bereiken zowel next_layer als lowest_layer TCP. Meer wrappers kunnen ze verschillend maken, dus kies de interface die het werkelijke wire-protocol van de proxy draagt. Een HTTPS-proxy voegt nog een TLS-stap toe en valt buiten deze CONNECT-reeks in platte tekst.

Gerelateerde artikelen