Eine Verbindung, viele Anfragen
HTTPS ist HTTP innerhalb von TLS
Jedes Byte in diesem Kurs war auf der Leitung lesbar. In Kapitel 7 hat dein Client ein Passwort in einem authorization-Header als
Dieselben Bytes, verpackt
HTTPS ist
http://books.example/books https://books.example/books
HTTP bytes the same HTTP bytes
TLS: encrypts and checks them
TCP connection to port 80 TCP connection to port 443
Eine https-content-length, Chunks, die offene Verbindung und Connection: close bleiben alle unverändert. TLS weiß nicht, dass die Bytes HTTP sind, und es ist ihm egal.
Was TLS hinzufügt
TLS gibt einer Verbindung drei Dinge:
Verschlüsselung. Alles darin, Pfad und Query, jeder Header einschließlich
cookieundauthorizationund jeder Body, reist als Bytes, die nur die beiden Enden lesen können.Integrität. Wenn irgendetwas auf dem Weg ein Byte verändert, bemerkt das empfangende Ende es, und die Verbindung schlägt fehl, statt veränderte Daten weiterzugeben.
Identität des Servers. Der Server legt ein Zertifikat für seinen Namen vor, signiert von einer Stelle, der der Client vertraut, und der Client prüft, dass der Name zum Host in der URL passt. Ohne diese Prüfung könnte ein Client eine perfekt verschlüsselte Verbindung zu einem Betrüger aufbauen.
Manches bleibt sichtbar. Ein Beobachter sieht weiterhin die Adressen und Ports, wann die Verbindung geöffnet und geschlossen wird und ungefähr, wie viele Bytes in jede Richtung fließen. Meist sieht er auch den Namen des Servers, weil der Client ihn früh im Handshake nennt, damit der Server das richtige Zertifikat auswählen kann.
Jemand beobachtet eine HTTPS-Anfrage für /me, die ein Session-Cookie enthält. Was kann er lesen?
Basic-Zugangsdaten werden über HTTPS gesendet. Was ändert sich?
In Python
Das ssl der Standardbibliothek verpackt einen verbundenen
import socket
import ssl
host = "books.example"
context = ssl.create_default_context()
with socket.create_connection((host, 443), timeout=5) as sock:
with context.wrap_socket(sock, server_hostname=host) as tls:
tls.sendall(b"GET /books HTTP/1.1\r\nHost: books.example\r\nConnection: close\r\n\r\n")
print(tls.recv(4096))
ssl.create_default_context() prüft standardmäßig das Zertifikat und den Hostnamen. http.client.HTTPSConnection(host, timeout=5), das https-Geschwister der Klasse, die du seit Kapitel 3 benutzt, übernimmt dieses Verpacken für dich. server_hostname ist der Name, der geprüft wird, und der Name, den der Client im Handshake nennt. Das wrap_socket zurückgibt, hat sendall und recv, also würden read_head, read_chunked und read_body genau so davon lesen wie von einem gewöhnlichen Socket.
Bei requests genügt eine https-URL: requests.get("https://books.example/books", timeout=5) führt den Handshake durch und prüft das Zertifikat, weil seine Einstellung verify standardmäßig eingeschaltet ist. Kapitel 10 kommt darauf zurück. Wer verify ausschaltet, behält die Verschlüsselung, wirft aber die Identität des Servers weg.
Warum nicht hier
Diese Website hat keinen TLS-Endpunkt. Der Übungsdienst und dein eigener Server sprechen gewöhnliches HTTP, und die Sandboxes der Lektionen erreichen nichts anderes. Keine Lektion hier kann also einen Handshake oder ein Zertifikat zeigen.
Wenn du Python auf deinem eigenen Computer und eine Internetverbindung hast, kannst du dir ein echtes ansehen. Dieser optionale Schritt gehört nicht zum Kurs, und nichts prüft ihn. Er gibt die TLS-Version und den Inhaber (subject) des Zertifikats einer Website deiner Wahl aus. Der Block ist für eine EOF-Markierungen in einer Datei und führst sie mit python aus.
python3 - <<'EOF'
import socket
import ssl
host = "www.python.org" # or any https site you choose
context = ssl.create_default_context()
with socket.create_connection((host, 443), timeout=5) as sock:
with context.wrap_socket(sock, server_hostname=host) as tls:
print(tls.version())
print(tls.getpeercert()["subject"])
EOF
HTTP/2 und HTTP/3
Viele Websites antworten auf https mit HTTP/2. Es behält fetch_many getan haben. Es komprimiert Header, und es schreibt jeden Header-Namen klein, so wie es deine Antwort-
Was ändert HTTP/2?
Eine Client-Bibliothek wählt die Version für dich, und alles, was dieser Kurs gelehrt hat, von Methoden und Statuscodes bis zu Caching, Cookies und Authentifizierung, bedeutet in allen dreien dasselbe. Kapitel 10 greift requests und httpx auf, jetzt, wo du weißt, was jede davon für dich tut.