Kostenlose SSL Zertifikate mit letsencrypt

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.

Schreibe einen Kommentar