Για ssl::stream<tcp::socket> μέσω ενός συνηθισμένου HTTP proxy, χρησιμοποιήστε το ακατέργαστο μεταφορικό του πριν του ζητήσετε να κάνει TLS προς τον προορισμό:

auto& transport = tlsStream.next_layer();
  1. Συνδέστε αυτό το μεταφορικό με τον host και τη θύρα του proxy. Για έναν επιτρεπόμενο δημόσιο προορισμό HTTPS χωρίς ρυθμισμένα διαπιστευτήρια proxy, η λίστα HTTP proxy προσφέρει υποψήφια τελικά σημεία· ελέγξτε ότι το υποψήφιο επιτρέπει τη ζητούμενη σήραγγα.
  2. Στείλτε CONNECT με το authority του προορισμού, όπως api.example:443, και αναλύστε τις πλήρεις κεφαλίδες απόκρισης στο ακατέργαστο μεταφορικό. Ένα επιτυχές 2xx ανοίγει τη σήραγγα· μια άρνηση παραμένει απόκριση HTTP proxy.
  3. Ρυθμίστε το hostname του προορισμού, το απαιτούμενο SNI, τις ρίζες εμπιστοσύνης και την επαλήθευση ομοτίμου, μετά ξεκινήστε τη χειραψία πελάτη στο tlsStream.
  4. Αφού πετύχει το TLS, χρησιμοποιήστε αναγνώσεις και εγγραφές του SSL stream για την εφαρμογή. Η απευθείας ανάγνωση του επόμενου επιπέδου σε εκείνο το σημείο παρακάμπτει την επεξεργασία TLS.

Μεταφέρετε τυχόν περίσσευμα του HTTP parser στο επόμενο στάδιο. Το Asio έχει υπερφορτώσεις χειραψίας με buffer· το πέταμα μιας ουράς που ανήκει στον parser μπορεί να χάσει bytes που έχουν ήδη διαβαστεί από το socket.

Με αυτόν τον απλό τύπο, τόσο το next_layer όσο και το lowest_layer φτάνουν στο TCP. Περισσότερα περιτυλίγματα μπορούν να τα κάνουν διαφορετικά, οπότε διαλέξτε τη διεπαφή που μεταφέρει το πραγματικό wire protocol του proxy. Ένας HTTPS proxy προσθέτει άλλο ένα στάδιο TLS και βρίσκεται έξω από αυτή την ακολουθία CONNECT απλού κειμένου.

Σχετικά άρθρα