Установете 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 в явен текст.