Vytvorte CONNECT pred spustením TLS handshake v Asio
Použite spodnú vrstvu SSL streamu Asio na výmenu s bežným HTTP proxy a potom spustite TLS cez prijatý tunel.
Pre ssl::stream<tcp::socket> cez bežný HTTP proxy najprv použite jeho surový transport a až potom mu zverte TLS voči cieľu:
auto& transport = tlsStream.next_layer();
- Pripojte tento transport k hostiteľovi a portu proxy. Keď je povolený verejný cieľ HTTPS a nie sú nastavené prihlasovacie údaje proxy, zoznam HTTP proxy ponúka kandidátske koncové body; overte, či vybraný kandidát povoľuje požadovaný tunel.
- Odošlite CONNECT s authority cieľa, napríklad
api.example:443, a analyzujte úplné hlavičky odpovede na čistom transporte. Úspešná 2xx otvorí tunel; odmietnutie zostáva odpoveďou HTTP proxy. - Nastavte názov cieľového hostiteľa, požadované SNI, dôveryhodné korene a overenie peer, potom spustite handshake klienta na
tlsStream. - Po úspešnom TLS používajte pre aplikáciu čítanie a zápis cez SSL stream. Priame čítanie spodnej vrstvy v tomto bode obchádza spracovanie TLS.
Preneste zvyšok buffera HTTP parsera do ďalšej fázy. Asio má preťaženia handshake s bufferom; zahodenie chvosta, ktorý vlastní parser, môže stratiť bajty už prečítané zo socketu.
V tomto jednoduchom type dosahujú next_layer aj lowest_layer TCP. Viac obalov ich môže odlíšiť, preto zvoľte rozhranie, ktoré nesie skutočný drôtový protokol proxy. HTTPS proxy pridáva ďalšiu fázu TLS a do tejto sekvencie CONNECT v čistom texte nepatrí.