Vor kurzem habe ich mit dem HTTP-Proxy in verdreht gespielt. Nach viel Versuch und Irrtum denke ich, dass ich endlich etwas arbeite. Was ich jedoch wissen möchte, ist, wie, wenn es möglich ist, erweitere ich diesen Proxy, um auch mit HTTPS-Seiten umgehen zu können? Hier ist, was ich bis jetzt habe:
%Vor%Wie dieser Code zeigt, drucke ich aus Gründen des Beispiels gerade aus, was auch immer die Verbindung durchläuft. Ist es möglich, HTTPS mit den gleichen Klassen zu behandeln? Wenn nicht, wie sollte ich eine solche Sache umsetzen?
Wenn Sie eine Verbindung zu einer HTTPS-Website über einen HTTP-Proxy herstellen möchten, müssen Sie das CONNECT
HTTP-Verb verwenden (da so ein Proxy für HTTPS funktioniert). In diesem Fall verbindet sich der Proxy-Server einfach mit dem Zielserver und leitet alle vom Server gesendeten Daten zurück an den Socket des Clients (und umgekehrt). In diesem Fall ist kein Caching erforderlich (Sie können jedoch möglicherweise die Hosts protokollieren, mit denen Sie eine Verbindung herstellen).
Der Austausch sieht so aus (Client zu Proxy):
%Vor%Danach öffnet der Proxy einfach einen einfachen Socket auf dem Zielserver (noch kein HTTP oder SSL / TLS) und leitet alles zwischen dem ursprünglichen Client und dem Zielserver weiter (einschließlich des TLS-Handshakes, den der Client initiiert). Der Client aktualisiert den vorhandenen Socket, den er für den Proxy hat, um TLS / SSL zu verwenden (indem er den SSL / TLS-Handshake startet). Sobald der Client die Statuszeile '200' gelesen hat, ist es für den Client so, als hätte er direkt die Verbindung zum Zielserver hergestellt.
Ich bin mir nicht sicher, ob es verdreht ist, aber ich möchte Sie warnen, dass ein Webbrowser, wenn Sie einen HTTPS-Proxy implementieren, erwartet, dass das SSL-Zertifikat des Servers dem Domänennamen in der URL (Adressleiste) entspricht. Der Webbrowser wird andernfalls Sicherheitswarnungen ausgeben.
Es gibt verschiedene Möglichkeiten, z. B. das Erstellen von Zertifikaten im laufenden Betrieb, aber das Stammzertifikat muss im Browser vertrauenswürdig sein.