2012-07-24 6 views
8

Ich habe eine Rewrite-Regel, die HTTPS und www erzwingt. Das SSL-Zertifikat gilt für die www-Version der Site. Die gesamte Website muss HTTPS sein..htaccess Redirect nur ausgeführt, nachdem Browserwarnung

Das Problem ist, dass, wenn die Anfrage https://example.com/ ist, der Browser eine Warnseite anzeigt, bevor die Weiterleitung ausgeführt werden kann. ('Diese Verbindung ist nicht vertrauenswürdig' in Firefox und 'Dies ist wahrscheinlich nicht die gesuchte Seite!' In Chrome)

Wenn der Benutzer eine Ausnahme in Firefox hinzufügt oder den Fehler in Chrome ignoriert, wird die Rewrite-Regel ausgeführt und sie sind Weiterleitungen auf die www-Version der Website mit einer 100% -Sicherheitsseite.

RewriteEngine on 

RewriteCond %{HTTP_HOST} ^example.com$ [OR] 
RewriteCond %{HTTPS} !on 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L] 

RewriteCond %{HTTP_HOST} ^www.example.com$ 
RewriteCond %{HTTPS} !on 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L] 

Ich habe auf der Website, um die Regeln zu testen sowie auf http://martinmelin.se/rewrite-rule-tester/

Wie kann ich die Umleitung bevor der Browser Warnung auszuführen?

+0

Siehe: http://serverfault.com/a/360985/47187 – Bruno

+0

Mögliches Duplikat von [https zu nicht www und http zu www umleiten] (http://stackoverflow.com/a/10726167/372643). – Bruno

+0

Diese Frage könnte ein Duplikat sein, aber ich denke, das Problem hier ist ein wenig klarer gesagt, IMHO. – Jonathan

Antwort

8

Die Umleitung von https://example.com zu https://www.example.com kann nur erfolgen, nachdem der Client eine erste erfolgreiche Anfrage an https://example.com gestellt hat.

Dies liegt daran, dass HTTPS HTTP über TLS/SSL ist (siehe RFC 2818), das zuerst die SSL/TLS-Verbindung herstellt, bevor HTTP-Daten gesendet werden. mod_rewrite wird immer angewendet, nachdem die SSL/TLS-Verbindung hergestellt wurde. Dies wäre eigentlich ein Sicherheitsproblem, da ein Angreifer den Client neu schreiben und umleiten kann, bevor das Zertifikat verifiziert wurde. Selbst wenn das TLS-Upgrade innerhalb von HTTP (RFC 2817, das praktisch nie verwendet/unterstützt wird und nicht https ist), sollte die Umleitung dennoch von einer vertrauenswürdigen Entität stammen.

Damit diese anfängliche Verbindung funktioniert, muss der Server unter https://example.com über ein Zertifikat verfügen, das für example.com gültig ist, andernfalls wird diese Verbindung nicht einmal ausgeführt (und der Server sendet keine Umleitungsantwort).

Ihr Ziel zu erreichen, müssen Sie die Anforderung von https://example.com ein Zertifikat gültig für example.com und nach https://www.example.com präsentieren ein Zertifikat gültig für www.example.com zu präsentieren.

Es gibt zwei Lösungen:

  • Mit zwei verschiedene Zertifikate für die einzelnen Hosts, entweder durch verschiedene IP-Adressen oder Server Name Indication verwenden. Der Nachteil hier ist, dass nicht alle Clients SNI unterstützen, auch wenn es häufiger wird.
  • Verwenden eines einzigen Zertifikats, das sowohl für example.com als auch für www.example.com gültig ist. Dies kann erreicht werden, indem Sie ein Zertifikat mit mehreren SAN-DNS-Einträgen (Subject Alternative Name) erhalten (es funktioniert nicht nur mit *.example.com, da der Punkt nicht Teil des Platzhaltermusters ist).

Letzteres ist sicherlich die einfachste Lösung. Häufig stellen Zertifizierungsstellen Zertifikate mit SAN-Einträgen für die Nummern example.com und www.example.com aus, wenn Sie sich für das eine oder das andere bewerben, manchmal ohne zusätzliche Gebühr.

+0

Hinweis: Die meisten Platzhalterzertifikate enthalten sowohl "* .example.com" als auch "example.com" – cmorrissey

0

This post Adressen Ihr Problem und stellt die folgende Antwort:

Sie werden für example.com ein CERT benötigen, wenn Sie das ungültige cert Problem vermeiden wollen. Aus Sicherheitsgründen sind Weiterleitungen vor der Authentifizierung nicht erlaubt.

Eine weitere Option könnte sein, ein Wildcard-Zertifikat zu erhalten, die Sie für *.example.com passen würde ermöglichen. (Offenbar wird dies nicht funktionieren. Dank @Giel)

Sie könnten http://example.com/-https://www.example.com/ umleiten machen, aber das kann man nicht helfen, wenn Sie bereits Benutzer https://example.com/ besucht haben.

+0

Ein Platzhalter-Zertifikat wäre nicht genug, Sie benötigen sowohl example.com als auch * .example.com, da letzterer nicht mit dem ersten übereinstimmt. – Giel