Dies ist eine kanonische Frage zum Hosten mehrerer SSL-Websites auf derselben IP.
Ich hatte den Eindruck, dass für jedes SSL-Zertifikat eine eigene eindeutige IP-Adresse / Port-Kombination erforderlich ist. Aber die Antwort auf eine frühere Frage, die ich gestellt habe, widerspricht dieser Behauptung.
Unter Verwendung der Informationen aus dieser Frage konnte ich mehrere SSL-Zertifikate für dieselbe IP-Adresse und für Port 443 erhalten. Ich bin sehr verwirrt darüber, warum dies unter der Annahme funktioniert, dass jede SSL-Domain-Website auf der Website von anderen betrieben wird Der gleiche Server benötigt eine eigene IP / Port.
Ich bin misstrauisch, dass ich etwas falsch gemacht habe. Können auf diese Weise mehrere SSL-Zertifikate verwendet werden?
quelle
Antworten:
FYsI: "Mehrere (verschiedene) SSL-Zertifikate auf einer IP" wird Ihnen durch die Magie des TLS-Upgrades bereitgestellt. Es funktioniert mit neueren Apache-Servern (2.2.x) und einigermaßen aktuellen Browsern (ich kenne keine verrückten Versionen).
RFC 2817 (Upgrade auf TLS in HTTP / 1.1) enthält die wichtigsten Details, funktioniert jedoch grundsätzlich für viele Benutzer (wenn nicht für die Mehrheit).
Sie können das alte funky Verhalten mit dem
s_client
Befehl openssl (oder jedem "alt genug" Browser) reproduzieren .Bearbeiten zum Hinzufügen:
curl
kann dir anscheinend besser zeigen, was hier passiert als openssl:SSLv3
TLSv1
quelle
Ja, aber es gibt einige Einschränkungen.
Dies wird durch die Angabe des Servernamens erreicht, eine Erweiterung der Transportschichtsicherheit.
Was ist die Angabe des Servernamens?
Die Angabe des Servernamens ( RFC 6066 ; veralteter RFC 4366 , RFC 3546 ) ist eine Erweiterung der Transport Layer Security , mit der der Client dem Server den Namen des Hosts mitteilen kann, den er zu erreichen versucht.
SNI ist gemäß Spezifikation mit TLS 1.0 und höher kompatibel, die Implementierungen können jedoch variieren (siehe unten). Es kann nicht mit SSL verwendet werden, daher muss eine Verbindung TLS (siehe RFC 4346, Anhang E ) aushandeln, damit SNI verwendet werden kann. Dies geschieht in der Regel automatisch mit unterstützter Software.
Warum wird SNI benötigt?
Bei einer normalen HTTP- Verbindung informiert der Browser den Server über den Hostnamen des Servers, den er über den
Host:
Header erreichen möchte. Auf diese Weise kann ein Webserver mit einer einzigen IP-Adresse Inhalte für mehrere Hostnamen bereitstellen, was allgemein als namensbasiertes virtuelles Hosting bezeichnet wird .Die Alternative besteht darin, jedem zu versorgenden Webhostnamen eine eindeutige IP-Adresse zuzuweisen. Dies wurde häufig in den Anfängen des Webs getan, bevor allgemein bekannt war, dass IP-Adressen ausgehen und Maßnahmen zur Beibehaltung ergriffen werden, und wird auch für virtuelle SSL-Hosts (ohne SNI) auf diese Weise durchgeführt.
Da bei dieser Methode zur Übertragung des Hostnamens die Verbindung bereits hergestellt sein muss, funktioniert sie nicht mit SSL / TLS-Verbindungen. Zum Zeitpunkt der Einrichtung der sicheren Verbindung muss der Webserver bereits wissen, welchen Hostnamen er dem Client bereitstellen soll, da der Webserver selbst die sichere Verbindung herstellt.
SNI behebt dieses Problem, indem der Client den Hostnamen im Rahmen der TLS-Aushandlung überträgt, sodass der Server bereits weiß, welcher virtuelle Host für die Bereitstellung der Verbindung verwendet werden soll. Der Server kann dann das Zertifikat und die Konfiguration für den richtigen virtuellen Host verwenden.
Warum nicht unterschiedliche IP-Adressen verwenden?
Der HTTP-
Host:
Header wurde so definiert, dass aufgrund des Mangels an IPv4-Adressen, der bereits Mitte der neunziger Jahre als Problem erkannt wurde, mehr als ein Webhost von einer einzelnen IP-Adresse aus bedient werden kann. In gemeinsam genutzten Webhosting-Umgebungen können auf diese Weise Hunderte von eindeutigen, nicht verwandten Websites mit einer einzigen IP-Adresse bedient werden, wodurch der Adressraum geschont wird.Shared-Hosting-Umgebungen stellten dann fest, dass der größte Verbraucher von IP-Adressräumen die Notwendigkeit sicherer Websites mit eindeutigen IP-Adressen war, was SNI als Stop-Gap-Maßnahme auf dem Weg zu IPv6 erforderlich machte. Heutzutage ist es manchmal schwierig, nur 5 IP-Adressen (/ 29) ohne wesentliche Begründung zu erhalten, was häufig zu Verzögerungen bei der Bereitstellung führt.
Mit dem Aufkommen von IPv6 sind solche Adresserhaltungstechniken nicht mehr erforderlich, da einem einzelnen Host mehr IPv6-Adressen zugewiesen werden können, als das gesamte Internet heute enthält, aber die Techniken werden wahrscheinlich in der Zukunft noch weit verbreitet sein, um ältere IPv4-Adressen zu bedienen Verbindungen.
Vorbehalte
Einige Kombinationen aus Betriebssystem und Browser unterstützen SNI nicht (siehe unten). Die Verwendung von SNI ist daher nicht für alle Situationen geeignet. Sites, die auf solche System- / Browserkombinationen abzielen, müssten auf SNI verzichten und weiterhin eindeutige IP-Adressen für jeden virtuellen Host verwenden.
Insbesondere unterstützt keine Version von Internet Explorer unter Windows XP SNI. Da diese Kombination immer noch einen signifikanten (aber stetig abnehmenden; laut NetMarketShare etwa 16% des Internetverkehrs im Dezember 2012) Teil des Internetverkehrs darstellt, wäre SNI für eine Website, die auf diese Nutzergruppen abzielt, ungeeignet.
Unterstützung
Viele, aber nicht alle gängigen Softwarepakete unterstützen SNI.
(Das Weglassen von dieser Liste bedeutet nicht notwendigerweise mangelnde Unterstützung. Es bedeutet, dass die Anzahl der Eingaben begrenzt war oder ich die Informationen bei einer Suche nicht schnell finden konnte. Wenn Ihr Softwarepaket nicht aufgeführt ist, wird gesucht für seinen Namen und
sni
sollte zeigen, ob Unterstützung vorhanden ist und wie man es einrichtet.)Bibliotheksunterstützung
Die meisten Pakete sind von einer externen Bibliothek abhängig, um SSL / TLS-Unterstützung bereitzustellen.
Server-Unterstützung
Die meisten aktuellen Versionen der gängigen Serversoftware unterstützen SNI. Setup-Anweisungen sind für die meisten von diesen verfügbar:
Kundendienst
Die meisten aktuellen Webbrowser und Befehlszeilen-Benutzeragenten unterstützen SNI.
Desktop
Handy, Mobiltelefon
Befehlszeile
Keine Unterstützung
(Hinweis: Einige Informationen zu dieser Antwort stammen von Wikipedia .)
quelle
Das Problem:
Wenn ein Webclient und ein Webserver über HTTPS miteinander kommunizieren, ist das allererste, was passieren muss, der sichere Handshake.
Hier ist ein vereinfachtes Beispiel für einen solchen Handshake:
Wenn dies HTTP und nicht HTTPS wäre, hätte der Client als erstes Folgendes gesendet:
Dies ermöglichte mehrere virtuelle Hosts auf einer einzigen IP-Adresse, da der Server genau weiß, auf welche Domain der Client zugreifen möchte, nämlich example.com.
HTTPS ist anders. Wie ich vorher sagte, kommt der Händedruck vor allem anderen. Wenn Sie sich den dritten Schritt des oben abgebildeten Handshakes ansehen (Zertifikat), muss der Server dem Client ein Zertifikat als Teil des Handshakes vorlegen, hat jedoch keine Ahnung, auf welchen Domainnamen der Client zugreifen möchte. Der Server hat nur die Möglichkeit, jedes Mal dasselbe Zertifikat zu senden, das Standardzertifikat.
Sie können weiterhin virtuelle Hosts auf Ihrem Webserver einrichten, der Server sendet jedoch immer das gleiche Zertifikat an jeden Client. Wenn Sie versuchen, die Websites example.com und example.org auf Ihrem Server zu hosten, sendet der Server immer das Zertifikat für example.com, wenn ein Client eine HTTPS-Verbindung anfordert. Wenn ein Client example.org über eine hergestellte HTTPS-Verbindung anfordert, passiert Folgendes:
Durch dieses Problem wird die Anzahl der Domänen, die Sie über HTTPS bedienen können, effektiv auf eine pro IP-Adresse begrenzt.
Die Lösung:
Der einfachste Weg , dieses Problem zu lösen , ist für den Client , den Server zu sagen , welche Domain es zugreifen möchte während des Handshakes . Auf diese Weise kann der Server das richtige Zertifikat bereitstellen.
Dies ist genau das , was SNI oder Server Name Indication macht.
Mit SNI sendet der Client den Servernamen, auf den er zugreifen möchte, als Teil der ersten Nachricht, dem "Client Hello" -Schritt im obigen Handshake-Diagramm.
Einige ältere Webbrowser unterstützen SNI nicht. Unter Windows XP gibt es beispielsweise keine einzige Version von Internet Explorer , die SNI unterstützt. Beim Zugriff auf eine Ressource über HTTPS auf einem Server, der virtuelle SNI-Hosts verwendet, wird ein generisches Zertifikat angezeigt, das möglicherweise dazu führt, dass der Browser eine Warnung oder einen Fehler anzeigt.
Ich habe die Dinge hier vereinfacht, um nur das Prinzip des Problems und die Lösung zu erläutern. Wenn Sie eine technische Erklärung wünschen , kann die Wikipedia- Seite oder RFC 6066 als guter Ausgangspunkt dienen. Auf Wikipedia finden Sie auch eine aktuelle Liste der Server und Browser, die SNI unterstützen
quelle
http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI
Der Client-Browser muss auch SNI unterstützen. Hier sind einige Browser, die dies tun:
quelle
Die TLS-Erweiterung mit Angabe des Servernamens (RFC6066) ist erforderlich, damit namenbasierte vhosts über HTTPS funktionieren.
Die Erweiterung ist weit verbreitet und ich habe noch keine Probleme mit der aktuellen Software, aber es besteht die Möglichkeit, dass einige Clients (die sie nicht unterstützen) auf Ihre Standardwebsite weitergeleitet werden, wenn Sie von SNI abhängig sind.
quelle