Die letzten Tage habe ich mir letsencrypt angeschaut und bin wirklich positiv überrascht. Zum einen ist es gut dokumentiert und einfach zu benutzen, vor allem funktioniert es auch. Wie einfach es ist möchte ich hier zeigen.
Installation
Das letsencrypt Script wird beim ersten Aufruf alle Abhängigkeiten für das OS nachinstallieren und nachladen.
cd /root
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto
Konfiguration
Die Konfigurationsdatei befindet sich unter /etc/letsencrypt/cli.ini Hier können Dinge konfiguriert werden, die für alle Zertifikate gültig sein sollen.
Mir war es z.B. lieber 4096-bit RSA Keys (Default: 2048) zu erzeugen und die E-Mail Adresse ändert sich auch nicht.
rsa-key-size = 4096
email = webmaster@example.com
Zertifikat erstellen
Um ein Zertifikat zu erstellen benötigt man einen Webserver auf Port 80 mit einem bereits konfigurierten VirtualHost. Danach reicht ein einzelner Befehl um das SSL Zertifikat zu erstellen. Mit certonly signalisiert man, dass man Apache lieber selbst konfigurieren möchte.
./letsencrypt-auto certonly --webroot -w /var/www/example.com -d example.com -d www.example.com
Die Zertifikate (und alle weiteren Dateien) liegen anschließend unter /etc/letsencrypt/live
SSL Weiterleitung mit letsencrypt
Ich persönlich habe eine Weiterleitung von HTTP auf HTTPS konfiguriert. Dennoch muss der letsencrypt Server in der Lage sein Daten per HTTP aus dem VirtualHost abrufen zu können. Das dient zur Domain Verifikation. Die Lösung war einen Port 80 VirtualHost zu erstellen und mit mod_rewrite zu arbeiten:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com
ServerAdmin webmaster@example.com
CustomLog /var/log/apache2/access.log combined
ErrorLog /var/log/apache2/error.log
<Directory "/var/www/example.com">
RewriteEngine on
RewriteBase /
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/.well-known/.*$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]
</Directory>
</VirtualHost>
Der .well-known Pfad wird von letsencrypt verwendet und wird nicht weitergeleitet. Ansonsten wird alles auf HTTPS umgeleitet. Der VirtualHost hat also nur die Funktion letsencrypt zu bedienen und die Umleitung vorzunehmen.
Renewal
Die letsencrypt Zertifikate sind nur 90 Tage lang gültig. Daher sollte man einen cronjob einrichten der die Aktualisierung automatisiert. Auch das wurde von den Entwicklern sehr einfach gelöst. Bei mir läuft der Cronjob jeden Sonntag morgen. letsencrypt erneuert alle Zertifikate die noch weniger als 30 Tage gültig sind, von daher reicht das locker aus.
0 7 * * 0 /root/scripte/letsencrypt_renew.sh
Das Script prüft auch gleichzeitig ob Zertifikate erneuert wurden und startet anschließend die Dienste automatisch neu.
#!/bin/bash
LOGFILE=$(mktemp)
cd /root/letsencrypt
./letsencrypt-auto renew &> $LOGFILE
if [ $? -ne 0 ]; then
echo -e "ERROR: Something went wrong with letsencrypt.\n\n"
cat $LOGFILE
else
if [[ -n $(find -L /etc/letsencrypt/live/ -type f -mtime -1 2>/dev/null) ]]; then
echo -e "INFO: letsencrypt renewed some certificates.\n\n"
cat $LOGFILE
service apache2 graceful
fi
if [[ -n $(find -L /etc/letsencrypt/live/mailserver.example.com/ -type f -mtime -1 2>/dev/null) ]]; then
service postfix reload
service dovecot reload
fi
fi
rm $LOGFILE
Webseiten
letsencrypt Website: Link
letsencrypt Dokumentation: Link
Ich bin auf jedenfall ein großer Fan von diesem kostenlosen Service und HTTPS nutze ich ohnehin schon lange.