Für ssl::stream<tcp::socket> über einen gewöhnlichen HTTP-Proxy verwenden Sie dessen rohen Transport, bevor Sie ihn um TLS zum Ziel bitten:

auto& transport = tlsStream.next_layer();
  1. Verbinden Sie diesen Transport mit Proxy-Host und -Port. Für ein erlaubtes öffentliches HTTPS-Ziel ohne konfigurierte Proxy-Anmeldedaten bietet die HTTP-Proxy-Liste Kandidaten-Endpunkte; prüfen Sie, ob der Kandidat den angeforderten Tunnel zulässt.
  2. Senden Sie CONNECT mit der Authority des Ziels, etwa api.example:443, und werten Sie die vollständigen Antwort-Header auf dem rohen Transport aus. Ein erfolgreiches 2xx öffnet den Tunnel; eine Ablehnung bleibt eine HTTP-Proxy-Antwort.
  3. Konfigurieren Sie Ziel-Hostname, erforderlichen SNI, Trust-Roots und Peer-Verifikation und starten Sie dann den Client-Handshake auf tlsStream.
  4. Nach erfolgreichem TLS nutzen Sie Lesen und Schreiben des SSL-Streams für die Anwendung. Die nächste Schicht an dieser Stelle direkt zu lesen, umgeht die TLS-Verarbeitung.

Nehmen Sie jeden Überschuss des HTTP-Parsers in die nächste Stufe mit. Asio bietet Überladungen für gepufferte Handshakes; das Verwerfen eines parsereigenen Rests kann bereits aus dem Socket gelesene Bytes verlieren.

Mit diesem einfachen Typ erreichen next_layer und lowest_layer beide TCP. Weitere Wrapper können sie unterscheiden, daher wählen Sie die Schnittstelle, die das tatsächliche Wire-Protokoll des Proxys trägt. Ein HTTPS-Proxy fügt eine weitere TLS-Stufe hinzu und liegt außerhalb dieser Klartext-CONNECT-Folge.

Ähnliche Artikel