Dla ssl::stream<tcp::socket> przez zwykłe proxy HTTP najpierw użyj jego surowego transportu, a dopiero potem zleć mu TLS do celu:

auto& transport = tlsStream.next_layer();
  1. Podłącz ten transport do hosta i portu proxy. Gdy docelowy publiczny adres HTTPS jest dozwolony, a dane logowania do proxy nie są skonfigurowane, lista proxy HTTP podaje kandydatów na punkty końcowe; sprawdź, czy wybrany punkt zezwala na żądany tunel.
  2. Wyślij CONNECT z authority celu, na przykład api.example:443, i przeanalizuj pełne nagłówki odpowiedzi na zwykłym transporcie. Odpowiedź 2xx otwiera tunel; odmowa pozostaje odpowiedzią proxy HTTP.
  3. Skonfiguruj nazwę hosta celu, wymagany SNI, zaufane korzenie i weryfikację peera, a następnie rozpocznij handshake klienta na tlsStream.
  4. Po udanym TLS używaj w aplikacji odczytu i zapisu przez strumień SSL. Bezpośredni odczyt dolnej warstwy w tym momencie omija przetwarzanie TLS.

Przenieś resztę bufora parsera HTTP do następnego etapu. Asio ma przeciążenia handshake z buforem; odrzucenie ogona należącego do parsera może zgubić bajty już odczytane z gniazda.

W tym prostym typie next_layer i lowest_layer oba prowadzą do TCP. Więcej warstw opakowań może je różnić, więc wybierz interfejs niosący rzeczywisty protokół proxy. Proxy HTTPS dodaje kolejny etap TLS i nie należy do tej sekwencji CONNECT w postaci jawnej.

Powiązane artykuły