Woher weiß ein Webserver, welches Schlüsselpaar für die SSL-Entschlüsselung verwendet werden soll?

18

Ich verstehe, dass Apache beim Empfang einer Anfrage an einen der TCP-Ports, die es abhört (z. B. 80, 443), anhand des HTTP-Headers entscheidet, welcher Host angefordert wird Host. Der Server weiß dann, zu welchem ​​virtuellen Host er die Anforderung umleiten soll.

Aber wie funktioniert das bei HTTP über SSL / TLS? Da die gesamte HTTP-Anfrage verschlüsselt wird (zumindest glaube ich, dass ich sie irgendwo gelesen habe), können die Header-Informationen erst gelesen werden, nachdem der Server die Daten entschlüsselt hat. Zum Entschlüsseln muss jedoch bekannt sein, welches Schlüsselpaar verwendet werden soll, da auf einem Webserver mehrere SSL-Zertifikate installiert sein können.

Woher weiß der Server, welchen Schlüssel er zur Entschlüsselung benötigt?


Meine Vermutung :

Ich könnte mir vorstellen, dass der TLS-Handshake die notwendigen Informationen liefert.


In Bezug auf das Flag "Mögliche Duplikate" :

Ich bin damit einverstanden, dass die Antworten sowohl auf die verknüpfte als auch auf meine Frage ähnlich sind, muss aber sagen, dass die Frage unterschiedlich ist. Es steht außer Frage, ob oder wie das Hosten mehrerer Sites mit unabhängigen SSL-Zertifikaten möglich ist. Stattdessen befasst sich meine Frage mit dem zugrunde liegenden technischen Aspekt.

paolo
quelle
Related: serverfault.com/questions/126072/…
Ilmari Karonen
Ich stimme zu, dass die Antworten sehr ähnlich sind, aber ich glaube, dass die Fragen sehr unterschiedlich sind.
Paolo

Antworten:

29

Der Webserver wusste es ursprünglich nicht. Aus diesem Grund benötigten Sie für jeden SSL-Host, den Sie auf dem Server hosten wollten, eine separate IP-Adresse. Auf diese Weise wusste der Server, dass er, wenn eine Verbindung über IP X hergestellt wurde, die Konfiguration (einschließlich der Zertifikate) für den zugeordneten vhost verwenden musste.

Dies änderte sich mit Server Name Indication , einer TLS-Erweiterung, die es einem Client tatsächlich ermöglicht, den erforderlichen Hostnamen beim Handshake-Vorgang anzugeben. Diese Erweiterung wird in allen modernen Betriebssystemen verwendet, wird jedoch von alten Browsern oder Servern nicht unterstützt. Wenn Sie also erwarten, dass Clients IE 6 unter WinXP weiterhin verwenden, haben Sie Pech.

Sven
quelle
2
Wenn jemand immer noch XP benutzt, hat er es nicht verdient, meine Seite zu besuchen;)
paolo
2
Wenn Sie Clients auf diese Weise einschränken (Browser, keine Personen), müssen Sie sehr vorsichtig sein. Viele, viele Unternehmen aktualisieren Windows nicht sehr gut, und das Gleiche gilt für einige Anbieter von Android-Handys. In der Regel aktualisieren sie ihr Betriebssystem überhaupt nicht (oder zumindest nicht viel). Windows XP ist bei 8% und der Marktanteil vor 4.4 Android scheint riesig.
Coteyr
Falls der Server keine SNI-Unterstützung hat, kann ein Proxy mit SNI-Unterstützung vor einem Server ohne SNI-Unterstützung verwendet werden.
Kasperd
1
@coteyr Die überwiegende Mehrheit der verbleibenden XP-Benutzer befindet sich in China. Zum Glück gibt es anderswo nur eine sehr geringe Verwendung, zumindest im Internet.
Michael Hampton
7

Anscheinend haben Sie einige Missverständnisse in Bezug auf TLS / SSL. Die HTTP-Anforderung wird nicht mit dem öffentlichen Schlüssel des Servers verschlüsselt. Es wird durch eine symmetrische Verschlüsselung mit einem Schlüssel verschlüsselt, der im vorherigen Handshake ausgehandelt wurde.

Kurze Beschreibung des TLS-Handshakes: Server und Client verhandeln einige verschlüsselte, symmetrische Schlüssel und einige andere Details. Um MITM zu verhindern, sendet der Server normalerweise sein Zertifikat (Kette) an den Client und authentifiziert den Handshake mit dem Schlüssel im Zertifikat. (Es gibt auch einige andere Varianten, z. B. Clientauthentifizierung oder TLS-PSK, die bei HTTP jedoch nicht häufig verwendet werden.) Der Client kann das Zertifikat entweder (auf die übliche Weise) validieren oder ignorieren.

Während SNI wichtig ist, wenn mehrere TLS-Zertifikate an einer IP verwendet werden, ist es nicht unbedingt erforderlich, dass der Server die Anforderung entschlüsseln kann. Ohne SNI weiß der Server nicht, welche Zertifikatskette gesendet werden soll. Daher wählt der Server normalerweise eine aus (z. B. den ersten vhost), was natürlich eine falsche sein könnte. Wenn der Server eine falsche Zertifikatkette auswählt, sollte der Client diese ablehnen (damit die HTTP-Anforderung nicht weiter gesendet wird). Wenn der Client das Zertifikat ignoriert (oder wenn das ungültige Zertifikat für diese Site als vertrauenswürdig markiert ist), kann es erfolgreich fortgesetzt werden. Da der für die Verschlüsselung verwendete symmetrische Schlüssel nicht vom Zertifikat abhängt (TLS kann auch ohne Zertifikate verwendet werden), kann er vom Server entschlüsselt werden.

Nur eine kleine Anmerkung, warum ich über TLS schreibe, während Sie nach SSL fragten: TLS ist eine neue Version von SSL. Alle SSL-Versionen gelten für die allgemeine Verwendung als unsicher. Daher verwenden wir derzeit hauptsächlich TLS (1.0, 1.1, 1.2).

v6ak
quelle
"Die HTTP-Anforderung wird nicht mit dem öffentlichen Schlüssel des Servers verschlüsselt. Sie wird mit einer symmetrischen Verschlüsselung unter Verwendung eines Schlüssels verschlüsselt, der im vorherigen Handshake ausgehandelt wurde." Wusste das nicht, danke für das Heads-up! Ich weiß jedoch, dass TLS SSL ersetzt hat, aber wir haben uns an den herkömmlichen Begriff "SSL-Zertifikat" gehalten, daher meine Erwähnung.
Paolo
Ich weiß, dass Begriffe wie „SSL-Zertifikat“ häufig für TLS verwendet werden. Ich versuche, sie zu vermeiden, aber ich war mir nicht sicher, ob Sie (oder andere) den Begriff TLS kennen.
V6AK