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.
quelle
Antworten:
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.
quelle
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).
quelle