Uspostavite CONNECT prije pokretanja Asio TLS handshaka
Koristite niži sloj SSL toka Asio za razmjenu s običnim HTTP proxyjem, a zatim pokrenite TLS kroz prihvaćeni tunel.
Za ssl::stream<tcp::socket> kroz običan HTTP proxy najprije koristite njegov sirovi transport, a zatim mu povjerite TLS prema cilju:
auto& transport = tlsStream.next_layer();
- Povežite taj transport s hostom i portom proxyja. Kada je dopušteni javni HTTPS cilj bez postavljenih proxy akreditive, lista HTTP proxyja nudi kandidate; provjerite dopušta li odabrani kandidat traženi tunel.
- Pošaljite CONNECT s authorityjem cilja, na primjer
api.example:443, i raščlanite potpuna zaglavlja odgovora na običnom transportu. Uspješan 2xx otvara tunel; odbijanje ostaje odgovor HTTP proxyja. - Postavite ime ciljnog hosta, potrebni SNI, korijene povjerenja i provjeru peera, zatim pokrenite handshake klijenta na
tlsStream. - Nakon uspješnog TLS-a koristite čitanje i pisanje kroz SSL tok za aplikaciju. Izravno čitanje nižeg sloja u tom trenutku zaobilazi TLS obradu.
Prenesite eventualni višak HTTP parsera u sljedeću fazu. Asio ima preopterećenja handshaka s bufferom; odbacivanje repa koji posjeduje parser može izgubiti bajtove već pročitane iz socketa.
Kod ovog jednostavnog tipa i next_layer i lowest_layer dosežu TCP. Više omotača ih može razlikovati, zato odaberite sučelje koje nosi stvarni žičani protokol proxyja. HTTPS proxy dodaje još jednu TLS fazu i nije dio ovog CONNECT niza u čistom tekstu.