
Wie HTTPS-Verbindungen über Proxy-Server funktionieren: Die CONNECT-Methode
Bei der Verwendung eines HTTP-Proxys zur Netzwerkverbindung leitet der Proxy-Server die Client-Anfragen weiter. Da HTTPS jedoch zuerst einen TLS-Handshake erfordert, kann der Proxy-Server die Anfrage nicht direkt weiterleiten und muss zuerst eine Verbindung herstellen.
HTTP-Proxy-Anfrageweiterleitung
Proxy-Server verarbeiten HTTP-Verbindungen (also solche ohne TLS-Verschlüsselung) recht einfach. Wenn ein Client beispielsweise auf example.com zugreifen möchte, sendet er diese Anfrage:
GET http://example.com/index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Proxy-Connection: keep-alive
Diese Anfrage geht zuerst durch den Proxy-Server. Der Proxy analysiert die Ziel-URL und leitet dann die vollständige Anfrage weiter. Nach Erhalt der Antwort leitet er diese an den Client weiter.
HTTPS-Verbindungen
Wenn TLS-Verschlüsselung hinzugefügt wird, wird das Problem komplexer. Der Proxy-Server kann die Client-Anfrage nicht direkt weiterleiten, da er keine TLS-Verbindung mit dem Server im Namen des Clients herstellen kann. Wenn er dies täte, würde der Client TLS-Zertifikatsfehler feststellen.
Die CONNECT-Methode löst dieses Problem. Wie GET ist es eine HTTP-Methode, aber sie wird speziell zum Herstellen von Verbindungen verwendet. So funktioniert es:
-
Der Client sendet eine CONNECT-Anfrage an den Proxy-Server:
CONNECT example.com:443 HTTP/1.1 Host: example.com Proxy-Connection: keep-alive
-
Nach Erhalt der Anfrage stellt der Proxy-Server eine TCP-Verbindung mit dem Zielserver her und antwortet dann dem Client:
HTTP/1.1 200 Connection established
Der Proxy-Server leitet die CONNECT-Anfrage selbst typischerweise nicht an den Zielserver weiter
-
Danach wird der Proxy-Server zu einem transparenten TCP-Tunnel, der TCP-Pakete blind weiterleitet. An diesem Punkt kann der Client den TLS-Handshake durchführen und HTTPS-Daten übertragen. Da die Daten verschlüsselt sind, kann der Proxy-Server den Kommunikationsinhalt nicht einsehen oder ändern.
sequenceDiagram participant Client participant Proxy participant Server Client->>Proxy: CONNECT example.com:443 Proxy->>Server: TCP Connection Server->>Proxy: Connection Established Proxy->>Client: HTTP/1.1 200 Connection established Note over Client,Server: TLS Handshake Note over Client,Server: Encrypted Communication
Aus dem obigen Prozess können wir sehen, dass die CONNECT-Methode tatsächlich einen TCP-Tunnel einrichtet und nicht speziell für TLS konzipiert ist. Daher kann jede TCP-Anfrage durch diesen Tunnel übertragen werden.
Benötigen Transport-Layer-Proxys die CONNECT-Methode?
Für Proxys, die auf der Transportebene (TCP/UDP) arbeiten, wie SOCKS5-Proxys, ist die CONNECT-Methode nicht erforderlich. Dies liegt daran, dass sie TCP- und UDP-Verbindungen direkt verarbeiten und keine Anwendungsprotokolle (wie HTTP) verstehen müssen.
Wenn Clients über diese Proxys auf HTTPS-Websites zugreifen, muss der Proxy-Server nur:
- Die Verbindungsanfrage des Clients empfangen
- Eine TCP-Verbindung mit dem Zielserver herstellen
- Die beiden Verbindungen überbrücken