Kapitel 10
HTTPS, Zertifikate und Sicherheits-Header
Was ein Zertifikat beweist
Zähl die Stellen, an denen dieser Kurs „nur über HTTPS“ gesagt hat. Das Secure, also sendet ein Browser es über HTTPS und sonst nirgendwohin. Sein Name beginnt mit __Host-, was ein Browser nur aus einer HTTPS-Antwort annimmt. Basic-Zugangsdaten sind das Passwort in
Ein Name, ein Schlüssel, ein Aussteller und zwei Daten
Ein Server, der TLS spricht, legt ein Zertifikat vor. Hier sind fünf Zeilen des Testzertifikats, das dieses Kapitel verwendet, so wie das Werkzeug openssl sie ausgibt:
Issuer: O=Python Land course tests, CN=TEST ONLY Python Land Web Security course authority
Not Before: Nov 1 00:00:00 2026 GMT
Not After : Nov 1 00:00:00 2046 GMT
Subject: O=Python Land course tests, CN=TEST ONLY reading
DNS:reading.example, DNS:app.reading.example, DNS:notes.reading.example, DNS:localhost, IP Address:127.0.0.1
Die letzte Zeile listet die Namen auf, für die das Zertifikat gilt. Die Datei enthält außerdem einen öffentlichen Schlüssel, der hier nicht gezeigt wird. Ein Zertifikat verbindet also vier Dinge: einen Namen, einen öffentlichen Schlüssel, einen Aussteller, der die Aussage signiert hat, und den Zeitraum, in dem sie gilt. Diese Testdatei gilt zwanzig Jahre. Ein Zertifikat von einem öffentlichen Aussteller hält etwa ein Jahr oder kürzer.
Ein Zertifikat ist öffentlich. Der Server sendet es an jeden Client, der sich verbindet, und jeder kann es kopieren. Was einem Betrüger fehlt, ist der private Schlüssel, der zum öffentlichen Schlüssel in der Datei gehört. Während des TLS-Handshakes beweist der Server, dass er diesen privaten Schlüssel besitzt, ohne ihn preiszugeben. Ein kopiertes Zertifikat ohne den Schlüssel beweist nichts.
Was verbindet ein Zertifikat miteinander?
Signiert von jemandem, dem du schon vertraust
Jeder kann eine Datei schreiben, in der steht: „dieser Schlüssel gehört reading.example“. Ein Zertifikat zählt, weil ein Aussteller es signiert hat. Ein Aussteller heißt auch Zertifizierungsstelle (certificate authority); diese Lektion sagt Aussteller.
In Kapitel 2 hast du eine Nachricht mit einem
Die Signatur eines Ausstellers ist eine andere Art von Signatur, eine Public-Key-Signatur. Der Aussteller signiert mit einem privaten Schlüssel, den er nie teilt. Jeder kann die Signatur mit dem öffentlichen Schlüssel des Ausstellers prüfen, und das Prüfen gibt keine Macht zum Signieren. Dieser Kurs baut solche Signaturen nicht; es genügt zu wissen, welche Eigenschaft sie haben, die einem Tag mit Schlüssel fehlt.
Bleibt eine Frage: Woher bekommt der Client den öffentlichen Schlüssel des Ausstellers? Er beginnt mit einer
Warum schützt ein Aussteller ein Zertifikat nicht mit einem HMAC-Tag, wie dem, den du in Kapitel 2 erzeugt hast?
Drei Prüfungen
Bevor ein Client auch nur ein Byte einer Anfrage sendet, macht er drei Prüfungen am Zertifikat:
Aussteller. Wurde es von einem Aussteller auf meiner Liste signiert?
Name. Gilt es für den Namen, nach dem ich gefragt habe?
Datum. Liegt heute innerhalb seines Zeitraums?
Hier ist ein Modell der drei Prüfungen. Es ist ein Modell: Ein echter Client prüft Signaturen, wo dieser Code Namen vergleicht. Daten in der Form Jahr, Monat, Tag lassen sich als Text korrekt vergleichen, also hält das Modell sie als
Die ersten drei Aufrufe geben accepted, refused: wrong name und refused: unknown issuer aus. Jede Ablehnung nennt eine Prüfung. Die Namensprüfung ist die, die man vergisst: Ein vertrauenswürdiger Aussteller signiert Zertifikate für Millionen von Sites, also sagt „von einem vertrauenswürdigen Aussteller signiert“ nichts, solange nicht auch der Name passt.
Du verbindest dich mit reading.example. Der Server legt ein Zertifikat vor, das ein Aussteller, dem du vertraust, für other.example ausgestellt hat und das heute gültig ist. Welche Prüfung schlägt fehl?
Was gibt der vierte Aufruf im Block oben aus?
Was ein Zertifikat nicht sagt
Ein gültiges Zertifikat sagt dir, dass du mit einem Server sprichst, der den Schlüssel für den Namen besitzt, nach dem du gefragt hast, und dass ein Aussteller, dem du vertraust, das bestätigt hat. Sonst sagt es dir nichts. Es sagt nicht, wer die Site betreibt, was die Site mit einem Passwort macht oder ob ihr Code sicher ist. Bei der üblichen Art von Zertifikat prüft ein Aussteller, dass der Antragsteller den Namen kontrolliert, und mehr prüft er nicht. Manche Zertifikate nennen außerdem eine Organisation. Ein Client sieht sich das nicht an: Er prüft den Namen. Eine Site, die Passwörter als Klartext speichert, kann ein völlig gültiges Zertifikat haben.
Noch eine Grenze, nur zum Wiedererkennen. Ein Aussteller kann ein Zertifikat vor seinem Enddatum zurückziehen, was Widerruf (revocation) heißt. Pythons Standardkontext prüft das nicht.
Eine Site zeigt ein gültiges Zertifikat für den Namen, den du eingegeben hast. Was weißt du?
Du kannst jetzt sagen, was ein Client prüft. Noch macht nichts in deinem Projekt diese Prüfungen. Die nächste Lektion baut das