RFC 2818 - HTTP Over TLS (HTTPS) - 2. HTTP über TLS (HTTP Over TLS)
2. HTTP über TLS (HTTP Over TLS)
Kernprinzip
Konzeptionell sehr einfach: HTTP/TLS ist sehr einfach. Verwenden Sie HTTP über TLS genau so, wie Sie HTTP über TCP verwenden würden.
2.1. Connection Initiation (Verbindungsaufbau)
Prozess:
1. Client → Server: TCP-Verbindung aufbauen (Port 443)
2. Client → Server: TLS ClientHello senden
3. ↔ TLS-Handshake-Prozess ↔
4. Nach Handshake-Abschluss: Client kann erste HTTP-Anfrage initiieren
Anforderungen:
- ✅ HTTP-Client muss (MUST) als TLS-Client agieren
- ✅ Verbindung zum entsprechenden Port herstellen (Standard 443)
- ✅ TLS ClientHello senden, um Handshake zu beginnen
- ✅ Alle HTTP-Daten müssen (MUST) als TLS-„Anwendungsdaten" gesendet werden
Beispiel-Ablauf:
Client:
1. TCP-Verbindung zu www.example.com:443
2. ClientHello senden
Server:
3. ServerHello + Zertifikat antworten
4. ServerHelloDone
Client:
5. ClientKeyExchange
6. ChangeCipherSpec
7. Finished
Server:
8. ChangeCipherSpec
9. Finished
← TLS-Handshake abgeschlossen →
Client:
10. Verschlüsselte HTTP-Anfrage senden:
GET / HTTP/1.1
Host: www.example.com
2.2. Connection Closure (Verbindungsbeendigung)
TLS bietet eine Funktion für sichere Verbindungsbeendigung.
Closure Alert (Beendigungswarnung)
Definitionen:
- Gültige Beendigung (Valid Closure): Korrekte Beendigungswarnung empfangen
- Unvollständige Beendigung (Incomplete Close): Verbindung sofort nach Senden der Beendigungswarnung schließen
- Vorzeitige Beendigung (Premature Close): Verbindung ohne Empfang einer Beendigungswarnung geschlossen
Anforderungen:
- ✅ Implementierungen müssen (MUST) einen Austausch von Beendigungswarnungen initiieren, bevor sie eine Verbindung schließen
- ⚠️ Implementierungen können (MAY) die Verbindung nach dem Senden der Beendigungswarnung schließen (ohne zu warten)
- ❌ Verbindungen mit vorzeitiger Beendigung dürfen nicht (MUST NOT) die Sitzung wiederverwenden
2.2.1. Client Behavior (Client-Verhalten)
Problem: HTTP verwendet Verbindungsbeendigung, um das Ende der Serverdaten zu signalisieren.
Der Client muss (MUST):
- ✅ Jede vorzeitige Beendigung als Fehler behandeln
- ✅ Empfangene Daten als möglicherweise abgeschnitten behandeln
- ✅ Beendigungswarnung senden, bevor die Verbindung geschlossen wird
Besondere Fälle:
- Antwort ohne Content-Length:
HTTP/1.1 200 OK
Content-Type: text/html
[Verbindungsschluss zeigt Ende an]
← Vorzeitige Beendigung kann nicht zwischen Server und Angreifer unterscheiden →
- Content-Length vorhanden, aber nicht vollständig gelesen:
HTTP/1.1 200 OK
Content-Length: 1000
[Nur 500 Bytes vor Beendigung empfangen]
← Kann nicht feststellen, ob Serverfehler oder Angriff →
Ausnahme: Wenn empfangene Daten mit Content-Length übereinstimmen, sollte (SHOULD) als abgeschlossen behandelt werden.
Client-Beispiel:
✅ Normale Beendigung:
Client: closure_alert senden
Auf closure_alert des Servers warten
Verbindung schließen
⚡ Schnelle Beendigung:
Client: closure_alert senden
Verbindung sofort schließen (nicht warten)
← Dies erzeugt eine unvollständige Beendigung auf der Serverseite →
2.2.2. Server Behavior (Server-Verhalten)
RFC 2616-Anforderung: Server müssen (MUST) sich von Client-Beendigung ordnungsgemäß erholen.
Der Server sollte (SHOULD):
- ✅ Bereit sein, eine unvollständige Beendigung vom Client zu empfangen
- ✅ Bereit sein, auf diese Weise geschlossene TLS-Sitzungen wieder aufzunehmen
- ✅ Versuchen, Beendigungswarnungen mit dem Client auszutauschen
- ⚡ Kann (MAY) die Verbindung nach dem Senden der Beendigungswarnung schließen
Implementierungshinweis:
HTTP ohne persistente Verbindungen:
- Server signalisiert das Datenende durch Schließen der Verbindung
- Aber Client hat möglicherweise bereits die Beendigungswarnung gesendet und getrennt
2.3. Port Number (Portnummer)
Standard-Port: 443
Begründung:
HTTP-Server erwartet: Request-Line (z.B. GET / HTTP/1.1)
TLS-Server erwartet: ClientHello
← Kann auf demselben Port nicht unterschieden werden →
Lösung: Verschiedene Ports verwenden
- HTTP: 80
- HTTPS: 443
Beispiele:
# HTTP (Klartext)
curl http://www.example.com:80/
# HTTPS (verschlüsselt)
curl https://www.example.com:443/
2.4. URI Format (URI-Format)
Protokollidentifikator: https:// (anstelle von http://)
Beispiele:
https://www.example.com/~smith/home.html
https://api.example.com:8443/v1/users
https://192.168.1.1/admin
URI-Komponenten:
https://www.example.com:443/path?query#fragment
↑ ↑ ↑ ↑ ↑ ↑
scheme host port path query fragment