Rechnernetze
Home Nach oben Stichworte

Das TLS-Handshake-Protokoll

Das TLS-Handshake-Protokoll besteht aus drei Unterprotokollen, mit denen die Kommunikationspartner

Sicherheitsparameter für das TLS-Record-Protokoll austauschen können,
sich selbst authentisieren können,
ausgehandelte Sicherheitsparameter instanzieren können,
Fehlermeldungen austauschen können.

Das Handshake-Protokoll handelt eines TLS-Sitzung aus, die durch folgende Parameter spezifiziert ist:

Sitzung-Identifizierung,
Zertifizierung der Gegenstelle,
Kompressions-Methode,
Cipher-Spec legt die verwendeten Chiffren fest,
Master-Secret zur Schlüsselberechnung,
Fortsetzungsflag, um neue TLS-Sitzungen zu kreieren.

Das Change-Cipher-Spec-Protokoll dient dazu, Änderung in der Verschlüsselungsstrategie, z.B. um das Verschlüsselungsverfahren zu ändern oder andere Schlüssel zu verwenden. Es wird außerdem beim Handshake-Verfahren zur Aufnahme der Datenübertragung benutzt. Eine Change-Cipher-Spec-Nachricht bewirkt beim Empfänger eine Kopie der aktuellen Pending-State-Parameter in den Current-State.

Das Alert-Protokoll sendet im Fehlerfall eine Warnung an die Gegenstelle, wobei Art und Schwere des Fehlers dargestellt werden. "Fatale" Fehler führen zu einem Abbruch der Verbindung, wobei andere Sitzungen fortgesetzt werden dürfen, aber der Sitzungsidentifikator (session identifier) ungültig gemacht werden muss. Auch Alert-Nachrichten werden verschlüsselt und komprimiert übertragen.

Ein Closure-Alert dient dazu, den ordnungsgemäßen Abbruch einer Verbindung zu garantieren, damit kein Angriff durch nicht beendete Sitzungen ausgeführt werden kann (truncation attack). Ein Closure-Alert kann jeder Teilnehmer jederzeit auslösen, ehe er die Sitzung beendet. Der auslösende Teilnehmer braucht dabei nicht auf die entsprechende Antwort der Gegenstelle zu warten.

Ein Fehler-Alert kann folgende Nachrichten beinhalten:

unexpected_message
bad_record_mac
decryption_failed
record_overflow
decompression_failure
handshake_failure
bad_certificate
unsupported_certificate
certificate_revoked
certificate_expired
certificate_unknown
illegal_parameter
unknown_ca
access_denied
decode_error
decrypt_error
export_restriction
protocol_version
insufficient_security
internal_error
user_canceled
no_renegotiation

Einige dieser Nachrichten legen die schwere des Fehlers fest (z.B. bad_record_mac ist stets fatal), andere lassen dem Sender die Möglichkeit, diese selbst zu bestimmen.

Das TLS-Handshake-Protokoll dient dem Aushandeln der o.g. Sicherheits-Parameter einer Verbindung. Es arbeitet oberhalb des TLS-Record-Layers und besteht aus den folgenden Schritten:

In Hello-Nachrichten wird sich über Algorithmen geeinigt und Zufallszahlen ausgetauscht.
Danach wird ein Premaster-Secret vereinbart.
Client und Server können sich gegeneinander authentifizieren.
Danach wird aus dem Master-Secret ein Premaster-Secret abgeleitet.
Dem Record-Layer werden Sicherheitsparameter übergeben.
Client und Server können sich vergewissern, dass die Gegenstelle die gleichen Sicherheitsparameter verwendet und sich kein Angreifer in das Handshake eingemischt hat.

Ein Angreifer kann u.U. erreichen, dass zwei Kommunikationspartner die geringste Sicherheitsstufe aushandeln, indem er beispielsweise einen Port blockiert oder unauthentifizierte Verbindungen aufbaut. Daher sollten die Anwendungsschichten über die ausgehandelte Sicherheitsstufe informiert werden. Der Standard empfiehlt ausdrücklich, Daten nicht über 40 Bit Schlüssel- Algorithmen zu versenden, wenn sie für die Benutzer einen entsprechenden Wert besitzen.

Das TLS-Protokoll soll diese Sicherheitsanforderungen unterstützen. Um eine Verbindung aufzunehmen, sendet der Client ein "client hello"-Nachricht an den Server, der mit einer "server hello"-Nachricht antwortet (andernfalls wird ein fataler Fehler ausgelöst). In diesen Nachrichten werden die Security-Parameter ausgetauscht.

Handshake Protocol overview

Die mit ? versehenen Nachrichten werden nur optional oder unter bestimmten Umständen gesendet.

Nach den Hallo-Nachrichten werden die Zertifikate ausgetauscht, um sich gegenseitig zu identifizieren. Durch das "Laden" des Current-State (ChangeCipherSpec) wird die gesicherte Verbindung gestartet. Soll eine Verbindung wiederaufgenommen oder kopiert werden (d.h. mit den gleichen Parametern soll eine neue Verbindung aufgenommen werden), so wird das folgende Protokoll verwendet: