Ich habe mir gestern Abend mal testweise ein SSL-Zertifikat erstellt, das kann man ja für den Apache2 und mit OpenSSL inzwischen ziemlich einfach machen. Das Zertifikat alleine reichte ja nicht, ich musste also auch einen vhost dafür einrichten – gut, das war jetzt auch nicht schwierig. Interessant wurde die Sache dann, als ich mir überlegt habe, dass es ja in vielen Dingen erforderlich ist, dass eine Verbindung ausschließlich über SSL und Port 443 möglich, ein „Initialzugriff“ aber auch über HTTP und Port 80 möglich sein soll.
Das hätte den Vorteil, dass der entsprechende vhost auch dann erreichbar wäre, wenn man vergessen würde, https vor die Verbindung zu schreiben. Wie realisiert man so etwas mit möglichst geringem Aufwand? Eine Umleitung mit einem (PHP-)Skript ist schnell geschrieben aber natürlich vollkommen übertrieben und „uncool“. Interessanter ist bei so etwas natürlich eine mod_rewrite-Variante, die alles gleich über den Apache direkt regelt. Wie kann so etwas aussehn? Nach einigen Tests mit Conditions und der einhergehenden Studie der Dokumentation von mod_rewrite, habe ich folgende Lösung geschrieben, die wunderbar funktioniert:
Der eigentliche vhost
Hier würden auch directory-, Authentication-, und ähnliche Anweisungen erfolgen.
<VirtualHost 127.0.0.1:443> ServerName localhost:443 SSLEngine On SSLCertificateFile /etc/apache2/ssl/apache.pem </VirtualHost>
Das ist der „Dummy“-vhost
Dieser vhost dient dann nur noch dazu um eine Umleitung auf den oberen „443-vhost“ zu machen.
<VirtualHost localhost:80> ServerName localhost # Das folgende erzwingt SSL RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} </VirtualHost>
[…] geht’s ins Nirwana. Das ist unschön und so basteln wir uns eine Umleitung, wie z.B. hier beschrieben mit einem zweiten vhost in der […]
[…] ich das nächste mal nicht wieder Stunden in google verbringe: Force SSL Secure Debian Configure […]
Klasse Idee,
hab die Abfrage allerdings ein klein wenig abgeändert:
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [L]
Grüße
Andreas Becker
Meine alte Methode (redirect)hat immer mal wieder zu Problemen geführt, deine Idee ist echt klasse, hat mir sehr geholfen, besten Dank!