HTTPS für meine Websites mit Let's Encrypt und Virtualmin
geschrieben von Felix Beuster amVor ein paar Tagen habe ich diese und alle meine Webseiten umgestellt, sodass alle Anfragen über HTTPS, sprich SSL, laufen. Auf dem Weg zu einem verschlüsseltem Internet und mit vermehrten Hinweisen von Browsern auf unverschlüsselte Seiten, war dieser Schritt lange überfällig. In diesem Artikel beschreibe ich kurz die Umsetzung für meine Seiten.
Zertifikate durch Let's Encrypt
SSL basiert auf Zertifikaten, mit denen sich der Server sozusagen ausweist, und der Browser bzw. Nutzer auch weiß, dass er mit dem richtigen und echtem Server kommuniziert. Natürlich könnte man sich diese Zertifikate selbst erstellen, aber dem wird kein Browser vertrauen. Im Ergebnis bekommt man dann Warnseiten im Browser und der Besucher wird abgeschreckt. Man braucht also einen vertrauenswürdigen Zertifizierer, der die Zertifikate ausstellt und ihre Echtheit bestätigt. Dieser Service kostet bei den meisten Anbietern Geld, wenn man kostenlos bleiben möchte, kommt man früher oder später auf Let's Encrypt. Dies ist eine freie Zertifizierungsstelle der Internet Security Research Group (ISRG), welche von namhaften IT-Firmen auch unterstützt wird. Von ihnen ausgestellte Zertifikate werden vom Browser akzeptiert und die Verbindung zur Webseite als sicher angezeigt. Zudem bieten sie eine Möglichkeit, automatisiert die Zertifikate zu erstellen.
Erstellung und Einrichtung der Zertifikat
Da ich auf meinem Alfahosting * Server Virtualmin zur Verwaltung nutze, habe ich mich umgeschaut, ob es hier schon spezielle Lösungen gibt, oder es generell etwas zu beachten gibt. Hierbei bin ich dann auf eine Anleitung des Nutzers jochem gestoßen, der die Erstellung und Einrichtung der Zertifikate in Virtualmin einfach erklärt. Meine Anleitung wird daher seiner im Wesentlichen gleichen. In meinem Fall war ich direkt als Root auf dem Server eingeloggt.
1. Installieren des Let's Encrypt Programms
Hierzu braucht einfach nur das entsprechende Repository von GitHub geclont werden.
1git clone https://github.com/letsencrypt/letsencrypt
2. Erstellen der Zertifikatsordner
Dies sollte muss für jede Domain/jeden Nutzer separat gemacht werden, sprich für jeden virtuellen Server extra. Für Subdomains habe ich jedoch keine separaten Ordner angelegt.
1mkdir /home/user_name/ssl_certificates
3. Erstellung der Cronjobs
Die Cronjobs lassen sich entweder über die Kommandozeile mit sudo crontab -e bearbeiten, oder aber über die Virtualmin-Weboberfläche. Ich habe das in der Kommandozeile erledigt, mit folgendem Cronjob:
101 3 1 * * cd /root/letsencrypt/ && ./letsencrypt-auto certonly --email info@MYDOMAIN --agree-tos --webroot --renew-by-default -w /home/user_name/public_html/ -d www.domain.de -d domain.de -d subdomain.domain.de --authenticator webroot && cp /etc/letsencrypt/live/www.domain.de/cert.pem /home/user_name/ssl_certificates/cert.pem && cp -f /etc/letsencrypt/live/www.domain.de/chain.pem /home/user_name/ssl_certificates/chain.pem && cp -f /etc/letsencrypt/live/www.domain.de /fullchain.pem /home/user_name/ssl_certificates/fullchain.pem && cp -f /etc/letsencrypt/live/www.domain.de/privkey.pem /home/user_name/ssl_certificates/privkey.pem
Die Subdomains (demos.beusterse.de sowie photos.fixel.me) habe ich direkt in die Zertifikate der jeweiligen Hauptdomain mit aufgenommen.
Der Cronjob sollte nun einmal manuell ausgeführt werden, damit Zertifikate auch sofort verfügbar sind, und nicht erst am nächsten Monatsanfang. Dies kann in der Weboberfläche unter Webmin > System > Scheduled Cron Jobs erfolgen. Dort einfach den jeweiligen Job auswählen und auf Run Now drücken. Danach läuft der Job automatisch an jedem 1. des Monats um 3:01 morgens und aktualisiert die Zertifikate.
4. Aktivieren der Zertifikate
Ebenfalls in der Weboberfäche, müssen nun alle Server angepasst werden, die ein Zertifikat erhalten sollen. Dazu:
- Unter Edit Virtual Server muss SSL unter Enabled Features aktiviert sein.
- Unter Server configuration und Manage SSL Certificate im Tab Update Certificate and Key muss für Signed SSL certificate und Matching private key mittels der File on server Option die cert.pem bzw für den Key die privkey.pem ausgewählt werden. Hier hangelt man sich dann einfach durch die Ordner, bis man am anfangs erstellten Ordner angekommen ist.
- Sind beide ausgewählt, klickt man auf Install now
- Auf der selben Seite, aber im Tab CA Certificate auf gleiche Weise mittels File on server die fullchain.pem auswählen, dann Save certificate
5. Erzwingen von HTTPS
Damit der Datenverkehr ausschließlich über HTTPS läuft, muss dies vom Server festgelegt werden. Dies wird ein zwei Punkten nötig. Einerseits muss die .htaccess Datei wie folgt erweitert werden.
1<IfModule mod_rewrite.c>
2 RewriteEngine On
3 RewriteCond %{SERVER_PORT} 80
4 RewriteRule ^(.*)$ https://domain.de/$1 [R,L]
5</IfModule>
Dadurch werden alle eingehenden HTTP Anfragen direkt auf HTTPS umgeleitet. Darüber hinaus kann dem Browser mitgeteilt werden, zukünftig nur noch HTTPS zu nutzen, mittels HTTP Strict Transport Security (HSTS). Dies wird in der Konfigurationsdatei des Servers geändert, die unter /etc/apache2/sites-available/domain.de.conf zu finden ist. Dort einfach folgende Zeilen hinzufügen
1<VirtualHost *:443>
2Header always set Strict-Transport-Security “max-age=31536000; includeSubDomains”
3</VirtualHost>
Die Konfiguration muss dann natürlich noch mit einem /etc/init.d/apache2 reload geladen werden. Ich bin mir allerdings nicht ganz sicher, ob Virtualmin beim ändern von anderen Einstellungen diese Änderung überschreibt. Ich werde mal ein Auge drauf haben und hier gegebenenfalls eine Anmerkung verfassen.
6. Weitere Empfehlungen
Was ich noch gemacht habe, ist das Zertifikat der Domain auch für die Virtualmin Oberfläche einzurichten. Dies kann unter Webmin > Webmin Configuration > SSL Encryption im Tab Update Certificate gemacht werden. Laufen die Zertifikate allerdings ab, kann man unter Umständen den Zugriff auf die Oberfläche verlieren, je nach dem, wie der Browser entscheidet.
Es bietet sich daher an, die Zertifikate ebenfalls im Cronjob zu kopieren. Dazu kann entweder ein eigenständiger Job angelegt werden, oder man erweitertet den Job der Hauptdomain wie folgt:
1 && cp -f /etc/letsencrypt/live/www.domain.de/cert.pem /etc/webmin/miniserv.cert && cp -f /etc/letsencrypt/live/www.domain.de/fullchain.pem /etc/webmin/miniserv.chain && cp -f /etc/letsencrypt/live/www.domain.de/privkey.pem /etc/webmin/miniserv.pem
Fazit
Das war's, damit ist dann sollte alles laufen und die Webseite problemlos über HTTPS nutzbar sein. Fragen und Feedback könnt ihr gerne in die Kommentare schreiben.
Kommentare
Bisher keine Kommentare.Bitt warte 20 Sekunden, bevor du das Formular abschicken kannst.