Установіть CONNECT перед запуском TLS-рукостискання Asio
Використайте нижчий шар SSL-потоку Asio для обміну зі звичайним 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 у відкритому вигляді.