Kann ich feststellen, ob der SSL-Client die Servernamenanzeige nicht unterstützt, und in diesem Fall die Standard-HTTP-Website bereitstellen?

8

Ich muss SSL-SNI verwenden, aber leider unterstützen es von einem kürzlich veröffentlichten Cloudflare-Blogpost nur 90% des Netzwerks. Wie kann ich (z. B. mit nginx) feststellen, ob der Client SNI unterstützt, und die HTTP-Version der Website bereitstellen / umleiten? Ist das möglich? Wie kann ich sonst die 10% des Datenverkehrs mit SNI nicht verlieren? Ist es richtig anzunehmen, dass ich ohne ein gültiges Zertifikat keinen HTTPS-Verkehr zu HTTP umleiten kann und diese Anforderung daher nicht möglich ist?

Vielen Dank.

Cedivad
quelle
Hier wurde eine eng verwandte Frage gestellt: Nur dann zu SSL umleiten, wenn der Browser SNI unterstützt
Simon East

Antworten:

10

Wenn Sie HTTPS von Anfang an anbieten möchten, müssen Sie ein vom Client von Anfang an akzeptiertes Zertifikat bereitstellen. Andernfalls akzeptiert der Client die SSL-Verbindung nicht und Sie können den Client nicht auf eine andere Site oder eine reine HTTP-Version umleiten. Dies bedeutet, diesen Fall Ihnen zu unterstützen

  • Entweder muss ein einziges Zertifikat vorhanden sein, das alle Ihre Domänen enthält, damit Sie Nicht-SNI-Clients ein ordnungsgemäßes Zertifikat zur Verfügung stellen können. In diesem Fall benötigen Sie jedoch überhaupt kein SNI.
  • oder Sie müssen ein Standardzertifikat installieren, das nicht mit den meisten Ihrer Namen übereinstimmt. In diesem Fall können Sie dem Client nur eine andere Seite bereitstellen oder umleiten, wenn der Client dieses fehlerhafte Zertifikat akzeptiert.

Wenn Sie HTTPS nicht von Anfang an benötigen, dh wenn der Client normalerweise zuerst eine Verbindung mit einfachem HTTP herstellt, können Sie versuchen, die SNI-Unterstützung zu erkennen, damit Sie den Client später umleiten können. Dies kann durch Einfügen eines Bildes, von JavaScript oder ähnlichem von Ihrer HTTPS-Site erfolgen. Wenn das Laden erfolgreich ist, wissen Sie, dass der Client entweder SNI unterstützt oder Zertifikatfehler ignoriert.

Dies lässt natürlich alles offen für Man-in-the-Middle-Angriffe, da der Man-in-the-Middle nur ein anderes Zertifikat ausstellen oder HTTPS überhaupt nicht verfügbar machen muss, da Sie es in diesem Fall niemals versuchen werden um die Verbindung zu HTTPS zu aktualisieren. Darüber hinaus kann dies verwendet werden, um den Eindruck zu erwecken, dass die Clients SNI unterstützen, wenn der Man-in-the-Middle dies stattdessen tut. Davon sind nicht nur Nicht-SNI-Clients betroffen, sondern SNI-fähige Clients können nur abgefangen werden. Obwohl dies theoretisch möglich wäre, wird es nicht empfohlen, da Sie einfach alles in der Mitte managen und damit den Hauptpunkt der Verwendung von HTTPS in Frage stellen können.

Steffen Ullrich
quelle
0

Wie ich auf StackOverflow gepostet habe , können Sie die SNI-Unterstützung nur testen, bevor Sie sie benötigen. Das heißt, Sie können Benutzer nicht zu SNI HTTPS zwingen und dann zurückgreifen, wenn sie dies nicht unterstützen, da sie einen solchen Fehler (von Chrome unter Windows XP) erhalten, ohne dass sie fortfahren können.

Daher muss der Benutzer (leider) tatsächlich über eine unsichere HTTP-Verbindung beginnen und dann nur dann aktualisiert werden, wenn er SNI unterstützt.

Sie können die SNI-Unterstützung über Folgendes erkennen:

  1. Remote-Skript
    Laden Sie auf Ihrer einfachen HTTP-Seite einen <script>SNI-HTTPS-Server von Ihrem Zielserver. Wenn das Skript ordnungsgemäß geladen und ausgeführt wird, wissen Sie, dass der Browser SNI unterstützt.

  2. Domänenübergreifendes AJAX (CORS)
    Ähnlich wie bei Option 1 können Sie versuchen, eine domänenübergreifende AJAX-Anforderung von der HTTP-Seite an das HTTPS auszuführen. Beachten Sie jedoch, dass CORS nur eine eingeschränkte Browserunterstützung bietet .

  3. Sniff the User-Agent
    Dies ist wahrscheinlich die am wenigsten zuverlässige Methode, und Sie müssen sich zwischen einer Blacklist von Browsern (und Betriebssystemen), von denen bekannt ist, dass sie diese nicht unterstützen, oder einer Whitelist bekannter Systeme, die dies tun, entscheiden.

    Wir wissen, dass alle Versionen von IE, Chrome & Opera unter Windows XP und niedriger SNI nicht unterstützen. Eine vollständige Liste der unterstützten Browser finden Sie unter CanIUse.com .

Simon East
quelle