Vzpostavite CONNECT pred začetkom handshaka TLS v Asio
Uporabite spodnjo plast toka SSL Asio za izmenjavo z običajnim proxyjem HTTP in nato zaženite TLS skozi sprejeti tunel.
Za ssl::stream<tcp::socket> prek običajnega proxyja HTTP najprej uporabite njegov surovi transport in šele nato mu zaupajte TLS do cilja:
auto& transport = tlsStream.next_layer();
- Ta transport povežite z gostiteljem in vrati proxyja. Ko je javni cilj HTTPS dovoljen in poverilnice proxyja niso nastavljene, seznam proxyjev HTTP ponuja kandidatne končne točke; preverite, ali izbrani kandidat dovoljuje zahtevani tunel.
- Pošljite CONNECT z navedbo authorityja cilja, na primer
api.example:443, in razčlenite celotne glave odgovora na čistem transportu. Uspešna 2xx odpre tunel; zavrnitev ostane odgovor proxyja HTTP. - Nastavite ime ciljnega gostitelja, zahtevani SNI, korenska potrdila zaupanja in preverjanje peerja, nato zaženite handshake odjemalca na
tlsStream. - Po uspešnem TLS za aplikacijo uporabljajte branje in pisanje skozi tok SSL. Neposredno branje spodnje plasti na tej točki obide obdelavo TLS.
Morebitni ostanek medpomnilnika parserja HTTP prenesite v naslednjo stopnjo. Asio ima preobremenitve handshaka z medpomnilnikom; če zavržete rep, ki ga ima parser, lahko izgubite bajte, ki so že prebrani iz vtičnice.
Pri tej preprosti vrsti dosežeta next_layer in lowest_layer oba TCP. Več ovojev ju lahko razlikuje, zato izberite vmesnik, ki nosi dejanski žični protokol proxyja. Proxy HTTPS doda še eno stopnjo TLS in ne spada v to zaporedje CONNECT v čistem besedilu.