Усталюйце CONNECT перад запускам TLS-рукапаціскання Asio
Выкарыстоўвайце наступны ўзровень Asio SSL-струменя для звычайнага абмену праз HTTP-проксі, затым пачніце TLS праз прыняты тунэль.
Для ssl::stream<tcp::socket> праз звычайны HTTP-проксі выкарыстоўвайце яго сыры транспарт, перш чым патрабаваць ад яго TLS да пункту прызначэння:
auto& transport = tlsStream.next_layer();- Падключыце гэты транспарт да хоста і порта проксі. Для дазволенага публічнага HTTPS-пункта прызначэння без наладжаных уліковых даных проксі спіс HTTP-проксі прапануе кандыдатаў у канцавыя пункты; праверце, што кандыдат дазваляе запытаны тунэль.
- Адпраўце CONNECT з указаннем authority пункта прызначэння, напрыклад
api.example:443, і разбярыце поўныя загалоўкі адказу на сырым транспарце. Паспяховы 2xx адкрывае тунэль; адмова застаецца адказам HTTP-проксі. - Наладзьце імя хоста пункта прызначэння, патрэбны SNI, давераныя карані і праверку партнёра, затым пачніце рукапацісканне кліента на
tlsStream. - Пасля паспяховага TLS выкарыстоўвайце чытанне і запіс SSL-струменя для праграмы. Прамое чытанне наступнага ўзроўню ў гэты момант абыходзіць апрацоўку TLS.
Перанясіце любы лішак HTTP-парсера на наступны этап. У Asio ёсць перагружаныя варыянты буфераванага рукапаціскання; адкіданне хваста, якім валодае парсер, можа страціць байты, ужо прачытаныя з сокета.
З гэтым простым тыпам next_layer і lowest_layer абодва дасягаюць TCP. Больш абгортак можа зрабіць іх рознымі, таму выбірайце інтэрфейс, які нясе рэальны драцяны пратакол проксі. HTTPS-проксі дадае яшчэ адзін этап TLS і знаходзіцца па-за гэтай паслядоўнасцю CONNECT у адкрытым тэксце.