Ustanów CONNECT przed rozpoczęciem uzgadniania TLS w Asio
Użyj dolnej warstwy strumienia SSL Asio do wymiany ze zwykłym proxy HTTP, a następnie uruchom TLS przez zaakceptowany tunel.
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();
- 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.
- 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. - Skonfiguruj nazwę hosta celu, wymagany SNI, zaufane korzenie i weryfikację peera, a następnie rozpocznij handshake klienta na
tlsStream. - 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.