Établir CONNECT avant de lancer la poignée de main TLS d'Asio
Utilisez la couche suivante d'un flux SSL Asio pour l'échange HTTP en clair via le proxy, puis démarrez TLS dans le tunnel accepté.
Pour ssl::stream<tcp::socket> via un proxy HTTP ordinaire, utilisez son transport brut avant de lui demander d'effectuer TLS vers la destination :
auto& transport = tlsStream.next_layer();- Connectez ce transport à l'hôte et au port du proxy. Pour une destination HTTPS publique autorisée sans identifiants de proxy configurés, la liste de proxies HTTP propose des points de terminaison candidats ; vérifiez que le candidat autorise le tunnel demandé.
- Envoyez CONNECT en nommant l'authority de la destination, par exemple
api.example:443, et analysez les en-têtes complets de la réponse sur le transport brut. Un 2xx réussi ouvre le tunnel ; un refus reste une réponse de proxy HTTP. - Configurez le nom d'hôte de la destination, le SNI requis, les racines de confiance et la vérification du pair, puis lancez la poignée de main du client sur
tlsStream. - Une fois TLS réussi, utilisez les lectures et écritures du flux SSL pour l'application. Lire la couche suivante directement à ce moment contourne le traitement TLS.
Reportez tout reliquat de l'analyseur HTTP à l'étape suivante. Asio dispose de surcharges de poignée de main avec tampon ; jeter une queue appartenant à l'analyseur peut perdre des octets déjà lus sur la socket.
Avec ce type simple, next_layer et lowest_layer atteignent tous deux TCP. Davantage d'enveloppes peuvent les rendre différents, alors choisissez l'interface qui porte le protocole filaire réel du proxy. Un proxy HTTPS ajoute une autre étape TLS et se situe hors de cette séquence CONNECT en clair.