Change Cipher Spec Protocol
Kurz: Ein kurzes TLS-Teilprotokoll, das signalisiert: “Ab jetzt wird mit den gerade ausgehandelten Schlüsseln verschlüsselt weitergemacht.”
Genauer: Die Change-Cipher-Spec-Nachricht besteht nur aus einem einzigen Byte und markiert den Übergang vom unverschlüsselten Handshake zur verschlüsselten Kommunikation. Sowohl Client als auch Server senden diese Nachricht jeweils einmal, sobald sie bereit sind, mit dem neu ausgehandelten Sitzungsschlüssel zu verschlüsseln. In TLS 1.3 wurde dieser Schritt aus Vereinfachungsgründen entfernt (nur noch aus Kompatibilitätsgründen vorhanden).
Im Detail
Der Ablauf in TLS 1.2 (wo Change Cipher Spec noch aktiv genutzt wird) sieht vereinfacht so aus:
Client Server
|-- ClientHello ------------------------------>|
|<------------------------------ ServerHello --|
|<----------------------- Zertifikat, Schlüssel-Austausch --|
|-- Schlüsselaustausch-Daten ------------------>|
|-- [Change Cipher Spec] ---------------------->| ab hier: Client verschlüsselt
|-- Finished (verschlüsselt) ------------------>|
|<--------------------------- [Change Cipher Spec] --| ab hier: Server verschlüsselt
|<---------------------------- Finished (verschlüsselt) --|
Wichtig: Change Cipher Spec ist kein Teil des eigentlichen Handshake-Protokolls, sondern ein eigenständiges, drittes TLS-Teilprotokoll (neben Handshake und Application Data) — es teilt der Aufzeichnungsschicht (Record Layer) einfach mit: “Der nächste Record, den ich sende, nutzt bereits die neu ausgehandelte Verschlüsselung.” Weil Client und Server diesen Wechsel unabhängig voneinander vollziehen (jeder sobald er selbst bereit ist), kann es kurzzeitig asymmetrisch sein: Eine Seite verschlüsselt bereits, während die andere noch im Klartext sendet.
In TLS 1.3 wurde dieser explizite Signalisierungsschritt komplett entfernt — der Wechsel zur Verschlüsselung ist dort implizit an der Position im Handshake festgelegt, was das Protokoll vereinfacht und eine potenzielle Fehlerquelle beseitigt. Die (inhaltslose) Change-Cipher-Spec-Nachricht existiert in TLS 1.3 nur noch aus Kompatibilitätsgründen, damit Middleboxen (z. B. ältere Firewalls), die auf dieses Byte-Muster “warten”, nicht irritiert werden — TLS-1.3-Implementierungen senden ein leeres, funktionsloses Change-Cipher-Spec-Byte einfach mit, ohne dass es irgendeine Wirkung hätte, nur damit Netzwerk-Middleboxen den Traffic weiterhin als “normales TLS” erkennen.
Warum dieser Schritt überhaupt vereinfacht wurde
Der historische Grund für die Entfernung in TLS 1.3 liegt in einer Reihe realer Sicherheitsprobleme mit der alten, expliziten Signalisierung: 2014 wurde die sogenannte “Change Cipher Spec Injection”-Schwachstelle bekannt (CVE-2014-0224 in OpenSSL), bei der ein Angreifer durch geschicktes Einschleusen einer vorzeitigen Change-Cipher-Spec-Nachricht verwundbare Clients dazu bringen konnte, mit einem vorhersagbaren, schwachen Schlüssel zu verschlüsseln — praktisch ein Downgrade auf eine leicht zu entschlüsselnde Verbindung, obwohl die Verbindung nach außen wie normales TLS aussah. Solche Vorfälle bestärkten die TLS-1.3-Designer darin, das Protokoll insgesamt drastisch zu vereinfachen und explizite, separat verarbeitete Signalisierungsschritte wie Change Cipher Spec komplett zu streichen.
Verhältnis zu den anderen Handshake-Nachrichten
Innerhalb des TLS-1.2-Handshakes markiert Change Cipher Spec den einzigen Moment, an dem sich der Verschlüsselungszustand MITTEN im Protokollablauf ändert — alle Nachrichten davor (ClientHello, ServerHello, Zertifikatsaustausch) laufen unverschlüsselt, alle danach (die jeweilige Finished-Nachricht) bereits verschlüsselt. Das Handshake Protocol selbst enthält die eigentliche Aushandlungslogik (welche Cipher Suite, welche Schlüssel), Change Cipher Spec ist nur der reine Umschalt-Trigger dafür.
Aufbau der Nachricht
Technisch ist die Change-Cipher-Spec-Nachricht denkbar simpel: Der TLS-Record hat einen eigenen Content-Type-Wert (20) und einen einzigen Payload-Byte-Wert (0x01) — es gibt keine weiteren Felder, keine Parameter, nichts zu verhandeln. Diese Minimalität ist beabsichtigt: Die eigentliche kryptografische Aushandlung (welcher Algorithmus, welche Schlüssellänge, welcher Sitzungsschlüssel) ist bereits vollständig im vorangegangenen Handshake-Protocol abgeschlossen — Change Cipher Spec ist rein ein Synchronisationssignal zwischen den beiden bereits fertig ausgehandelten Zuständen “alt (unverschlüsselt)” und “neu (verschlüsselt)”.
Siehe auch: Handshake Protocol, TLS