Denkfehler - es wird nur der
öffentliche Schlüssel des Servers ausgetauscht (tatsächlich benötigt der Client gar kein asymmetrisches Schlüsselpaar). Offenbar wollt Ihr es ganz genau wissen, und bevor hier gefährliche Halbwahrheiten in Umlauf kommen... Also, hier ist der genaue Ablauf beim Handshake:
TCP-Verbindung
Zuerst muss natürlich eine TCP-Verbindung aufgebaut werden. Der Client sendet SYN(seq=i) an den Server. Dieser antwortet mit SYN(seq=k), ACK(seq=i+1). Darauf hin sendet der Client ACK(seq=k+1). Damit ist die Verbindung aufgebaut und beiden Seiten sind die beide Paketsequenzzähler (der eigene und der der Gegenstelle) bekannt.
SSL- bzw. TLS Handshake
Phase 1
Zuerst schickt der Client die "Begrüßungsformel"
ClientHello an den Server. Der Server antwortet mit
ServerHello. Danach tauschen Client und Server je 28 Bytes an Zufallsdaten (
ServerHello.random bzw.
ClientHello.random) aus. Danach bietet der Client dem Server eine Liste der von ihm unterstützten Cipher Suites an, also eine Kombination aus (asymmetrischem) Schlüsselaustauschverfahren, (symmetrischem) Verschlüsselungsverfahren und Message Authentication Code. Der Server wählt aus dieser Liste gemäß seiner Konfiguration die bestmögliche Kombination aus. Sind die Mengen der client- und serverseitig unterstützten Cipher Suites disjunkt, bricht der Handshake ab.
Phase 2
Der Server überträgt sein Zertifikat (also öffentlicher Schlüssel + Identitäts- und Gültigkeitsinformationen + digitale Signatur der Zertifizierungsstelle) an den Client. Optional forder der Server auch vom Client ein Zertifikat an. Damit ließen sich auch Clients per Zertifikat authentifizieren (üblich bei VPNs, seltener bei Webseiten - aber es gibt Ausnahmen).
Phase 3
Der Client versucht, die Identität des Servers zu bestätigen, indem er an den Server ein 48 Byte langes Pre-Master-Secrect schickt, das vor der Übertragung mit dem Public Key des Servers verschlüsselt wurde.
Phase 4
Der Server entschlüsselt das Pre-Master-Secret mit seinem Private Key und berechnet daraus zusammen mit den in Phase 1 ausgetauschten Zufallsdaten das Master Secret. Nun generiert der Server eine ServerFinished-Meldung, in die auch MD5- und SHA1-Hashwerte aller zuvor mit dem Client ausgetauschten Nachrichten eingebettet werden. Diese ServerFinished-Meldung wird mit dem Master Secret und dem gewählten symmetrischen Algorithmus verschlüsselt und an den Client gesendet. Dem Client liegen ebenfalls alle Informationen zur Errechnung des Master Secret und der zu erwartenden ServerFinished-Meldung vor, so dass er die Antwort des Servers mit der erwarteten ServerFinished-Meldung vergleichen kann. Sind beide Finished-Meldungen identisch, so ist dies der Nachweis, dass der Server tatsächlich über den zu seinem Public Key passenden Private Key verfügt.
Im kryptographischen Sinne ist die Verbindung damit vertraulich und integer. Alle Informationen, die ab jetzt über die Verbindung übertragen werden (egal in welcher Richtung), werden zuvor mit dem Master Secret symmetrisch verschlüsselt und mit einem Message Authentication Code versehen. Sie sind so vor unbefugter Einsicht und Manipulation geschützt.
Und obwohl der Client kein asymmetrisches Schlüsselpaar eingesetzt hat, wurde das Master Secret nie über die noch nicht gesicherte Verbindung übertragen, genauso wenig das Pre-Master-Secret!
Identitätsabgleich
Ein letzter Schritt fehlt allerdings noch, um für die Verbindung nicht nur Vertraulichkeit und Integrität, sondern auch Verbindlichkeit zu gewährleisten - sprich, die Identität der jeweiligen Gegenstelle zweifelsfrei festzustellen. Verglichen mit dem Handshake ist dieser Schritt jedoch vergleichsweise simpel: Der Client (und analog auch der Server, falls er ein Zertifikat vom Client angefordert hat) gleichen erst das Zertifikat mit einer Liste bekannter (und vertrauenswürdiger) Zertifikate ab. Falls es hierbei keinen Match gibt, wird die Zertifizierungsstelle mit einer Liste vertrauenswürdiger Zertifizierungsstellen abgeglichen. Dieser Vorgang wird notfalls rekursiv wiederholt, bis das Wurzelzertifikat der Zertifikatskette abgeglichen wurde. Wurde auch bis hierhin kein Match erzielt, hängt es an der Implementierung der Anwendung, wie sie reagiert. Entweder wird die Verbindung abgebrochen, oder (bei interaktiven Anwendungen) der Anwender muss entscheiden, ob der Verbindung trotzdem vertraut wird.
So, wenn Ihr es noch genauer wissen wollt, müsst Ihr Euch schon
RFC 2246 durchlesen...
