За ssl::stream<tcp::socket> през обикновено HTTP прокси използвайте суровия му транспорт, преди да го помолите да извърши TLS към дестинацията:

auto& transport = tlsStream.next_layer();
  1. Свържете този транспорт към хоста и порта на проксито. За разрешена публична HTTPS дестинация без конфигурирани идентификационни данни за прокси списъкът с HTTP проксита предлага кандидат-крайни точки; проверете дали кандидатът разрешава поискания тунел.
  2. Изпратете CONNECT с authority на дестинацията, например api.example:443, и анализирайте пълните заглавки на отговора върху суровия транспорт. Успешен 2xx отваря тунела; отказът остава отговор на HTTP прокси.
  3. Настройте името на хоста на дестинацията, необходимия SNI, доверените корени и проверката на партньора, след което стартирайте ръкостискането на клиента върху tlsStream.
  4. След успешен TLS използвайте четене и запис на SSL потока за приложението. Директното четене на следващия слой в този момент заобикаля обработката на TLS.

Пренесете всеки излишък от HTTP парсера към следващия етап. Asio има претоварвания за буферирано ръкостискане; изхвърлянето на опашка, притежавана от парсера, може да загуби байтове, вече прочетени от сокета.

С този прост тип next_layer и lowest_layer и двата достигат TCP. Повече обвивки могат да ги направят различни, затова изберете интерфейса, който носи действителния мрежов протокол на проксито. HTTPS проксито добавя още един TLS етап и е извън тази последователност CONNECT в явен текст.

Подобни статии