CONNECT aufbauen, bevor der Asio-TLS-Handshake beginnt
Nutzen Sie die nächste Schicht eines Asio-SSL-Streams für den einfachen HTTP-Proxy-Austausch und starten Sie dann TLS durch den angenommenen Tunnel.
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();- 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.
- 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. - Konfigurieren Sie Ziel-Hostname, erforderlichen SNI, Trust-Roots und Peer-Verifikation und starten Sie dann den Client-Handshake auf
tlsStream. - 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.