Ich habe derzeit einen Server, der automatisch alle HTTP-Anforderungen an die entsprechende HTTPS-Site umleitet. Das Problem ist, dass anscheinend einige Browser das SSL-Zertifikat (StartSSL.com) nicht akzeptieren oder SNI nicht unterstützen. Daher erhalten sie eine Zertifikatwarnung und der Benutzer surft nicht weiter auf der Website.
Gibt es einen Mechanismus, der versucht, den Browser dazu zu bringen, HTTPS anstelle von einfachem HTTP zu verwenden, und wenn dies nicht funktioniert (z. B. wird das Zertifikat nicht akzeptiert oder SNI nicht unterstützt), wird HTTP weiterhin verwendet.
Derzeit verwende ich Apache 2.4 mit mehreren virtuellen Hosts, mit denen alle die HTTP-Verbindung umleiten Redirect / https://domain.example/
.
apache-2.2
ssl
http
apache-2.4
sni
Foxylion
quelle
quelle
Antworten:
Ein Browser sollte niemals ein Downgrade auf http durchführen, wenn https nicht funktioniert, da ein Angreifer lediglich https nicht verfügbar machen muss (z. B. Blockport 443). Dies kann nur erreicht werden, indem der Browser vom Server dazu angewiesen wird, z. B. durch Senden einer http-Umleitung. Natürlich sollte dies über eine sichere Verbindung gesendet werden (andernfalls könnte ein Mann in der Mitte es vortäuschen), aber leider ist es genau Ihr Problem, dass die sichere Verbindung fehlschlägt.
Zusammenfassend: Nein, es ist nicht möglich und es ist besser so.
Übrigens unterstützen alle modernen Browser SNI, aber nicht alle Anwendungen (z. B. Java-Apps usw.). Wenn Sie mehrere Domänen auf dem Webserver haben, aber nur eine einzige von diesen Apps benötigt wird, können Sie das Zertifikat für diese Domäne als Standard festlegen. Andernfalls benötigen Sie ein (teureres) Zertifikat, das alle erforderlichen Domänen als alternative Betreffnamen enthält.
Bearbeiten Sie mit einer anderen Idee: Sie könnten versuchen, ein Bild von Ihrer Seite als https herunterzuladen und den Erfolg mit einem onerror-Handler auf dem img-Tag zu überprüfen. Möglicherweise löst dies keine vom Benutzer sichtbare Warnung aus, sondern kann nur nicht geladen werden. Und wenn dies gelingt, wissen Sie, dass ein https-Zugriff möglich ist, und leiten den Benutzer weiter.
Abgesehen davon müssen Sie sich fragen, warum Sie https überhaupt anbieten möchten, wenn Sie den Zugriff auch mit http akzeptieren. Entweder gibt es Daten, die geschützt werden sollten, oder sie sind es nicht. Solange Sie einen Fallback für http anbieten, ist es für einen Angreifer einfach, http anstelle von https zu erzwingen.
quelle
Zunächst sollte es möglich sein, ein Zertifikat anzugeben, das für alle Clients ohne SNI-Unterstützung verwendet werden soll. Dies bedeutet, dass von allen Domänen, die auf dieser IP-Adresse gehostet werden, mindestens eine für Clients ohne SNI arbeiten kann.
Wenn Sie dann von http nach https umleiten, können Sie eine zweistufige Umleitung durchführen. Bei der ersten Umleitung von http zu https wird der Domänenname verwendet, von dem Sie sichergestellt haben, dass er mit oder ohne SNI-Unterstützung funktioniert. Die vollständige ursprüngliche URL müsste enthalten sein, damit Sie von dieser https-Site anschließend zur richtigen weiterleiten können.
Der Domänenname, der mit oder ohne SNI funktioniert, kann sich unterschiedlich verhalten, je nachdem, ob SNI vom Client unterstützt wird. Auf diese Weise wissen Sie, dass der Client SNI unterstützt, bevor Sie ihn auf eine Domäne umleiten, für die SNI erforderlich ist.
Wie genau dies auf Apache konfiguriert werden soll, wird von meiner Seite ein wenig erraten (da ich Apache nie mit mehr als einem Zertifikat konfiguriert habe). Ich denke, der Weg dazu wäre, namenbasierte virtuelle Hosts für alle Domänen einschließlich der Zwischendomäne zu erstellen.
Erstellen Sie dann einen virtuellen Standardhost für Clients ohne SNI, der dasselbe Zertifikat wie das mit dem Namen verwendet. Diese beiden virtuellen Hosts mit identischem Zertifikat senden unterschiedliche Umleitungen an die Clients, je nachdem, ob sie SNI unterstützen.
Schließlich würde ich IPv6 auf dem Server aktivieren. Mit IPv6 erhalten Sie genügend IP-Adressen, die Sie jedem virtuellen Host zuweisen können. Dieselbe Gruppe virtueller Hosts kann ein Name sein, der auf IPv4 basiert, und eine IP, die auf IPv6 basiert, sodass Sie auf diese Weise keine Konfiguration duplizieren müssen.
Das Endergebnis wäre ein Setup, das funktioniert, solange der Client entweder SNI oder IPv6 unterstützt. Nur Clients, die beides nicht unterstützen, haben dann ein Problem, aber Sie können diese weiterhin erkennen und eine andere Umleitung oder eine Fehlermeldung auf dem Server ausführen.
Für Kunden, die die Zertifizierungsstelle nicht mögen, ist mein einziger Vorschlag, sie an ihrem Benutzeragenten zu erkennen und sie so zu behandeln, wie Sie es für angemessen halten. Stellen Sie sicher, dass Sie einen Link zur https-Site haben, auf den sie klicken können, falls Sie versehentlich zu viele Clients eingeschlossen haben.
quelle
Nur eine wilde Vermutung: Könnte es sein, dass Ihre Apache-Konfiguration keine SSLCertificateChainFile- Direktive enthält, die die Datei sub.class1.server.ca.pem enthält, die Sie für StartSSL benötigen?
quelle