SSL-Zertifikate mit Let's Encrypt

Aus LT42-Wiki
Zur Navigation springenZur Suche springen

Die Erstellung von SSL-Zertifikaten zur Verschlüsselung von Server-Verbindungen ist dank StartCom kostenlos, aber mit jährlichem Aufwand verbunden, da die beantragten Zertifikate jährlich erneuert werden müssen.

Selbstsignierte Zertifikate sind für den Einsatz auf privaten Seiten zur Absicherung zwar sinnig, führen aber zu Sicherheitswarnungen, was sie für den produktiven Betrieb einer öffentlichen Internetseite ausschließt.

Eine spannende Möglichkeit, um an kostenlose SSL-Zertifikate zu gelangen, bietet nun die Internet Security Research Group (ISRG), einem Zusammenschluss mehrerer Firmen, u.a. Mozilla, Cisco und OVH, die mit Let's Encrypt einen Dienst zur Verfügung stellen, der automatisiert Zertifikate erstellt und ausgibt. Der Antragsteller muss lediglich verifizieren, dass er Zugriff auf die Domain hat.

Let's Encrypt herunterladen

Für den Einsatz von Let's Encrypt sind eine Reihe von Python-Anwendungen nötig, die über Github verfügbar sind. Falls git auf dem Server noch nicht installiert ist, muss dies nachinstalliert werden:

sudo apt-get update
sudo apt-get install git

Danach wechseln wir in ein Verzeichnis, in dem Let's Encrypt installiert werden kann (zum Beispiel /root) und klonen die aktuelle Version:

git clone https://github.com/letsencrypt/letsencrypt

Das Skript legt ein Verzeichnis letsencrypt an, in dem sich u.a. die Datei letsencrypt-auto befindet. Falls keine Rechte zum Ausführen gesetzt sind, fügen wir welche hinzu:

chmod +x ./letsencrypt-auto

Zertifikate erstellen

Let's Encrypt bietet es an, vollautomatisch Zertifikate zu generieren und gleich in die Apache-Konfiguration aufzunehmen. Dafür reicht ein parameterloser Aufruf des Programms-. Wer nur die Zertifikate und keine Konfiguration braucht, kann Let's Encrypt mit folgendem Aufruf starten:

sudo ./letsencrypt-auto --rsa-key-size 4096 certonly

Dabei legen wir eine RSA-Key-Länge von 4096 statt standardmäßig 2048 fest, um die Sicherheit der Verschlüsselung zu erhöhen. Der Befehl certonly generiert nur Zertifikate ohne den Webserver zu konfigurieren. Beim ersten Aufruf installiert Let's Encrypt automatisch die erforderlichen Pakete nach.

Im nächsten Schritt fragt Let's Encrypt wie die Verifizierung vorgenommen werden soll. Hier bediene ich den zweiten Weg, das Ablegen einer Datei im Root-Verzeichnis der Domain:

2 Place files in webroot directory (webroot)

Let's Encrypt fragt dann, für welche Domain ein Zertifikat erstellt werden soll. Alle Domainnamen, die wir hier angeben, werden als Alternativ-Name im Zertifikat hinterlegt.

Im nächsten Schritt wird dann der Pfad der Seite angegeben. Let's Encrypt wird im nächsten Schritt einen Pfad .well-known anlegen. Es ist also zu überlegen, diesen Pfad für alle Domains auf ein Verzeichnis umzuleiten und dieses als webroot anzugeben. Ansonsten klickt man sich einmal bis zum richtigen Verzeichnis durch. Pro Domain muss hier ein eigenes Verzeichnis angegeben werden. Wer nur ServerAlias-Domains verschlüsseln möchte, kann dann das Webroot-Verzeichnis der Hauptdomain angeben.

Hat alles geklappt, erstellt Let's Encrypt ein Verzeichnis unterhalb von /etc/letsencrypt/live, in dem die verschiedenen 4 Zertifikate angelegt werden.

Damit sind die Zertifikate erstellt.

Konfiguration Apache2

Für Apache2 ist folgende Konfiguration aufzunehmen:

<VirtualHost *:443>
        ServerAdmin webmaster@example.org
        ServerName example.org
        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/example.org/cert.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem
        SSLCertificateChainFile /etc/letsencrypt/live/example.org/chain.pem
        DocumentRoot /var/www/vhosts/example.org/httpdocs
        <Directory /var/www/vhosts/example.org/httpdocs/>
                Options FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
        SSLProtocol All -SSLv2 -SSLv3
        SSLHonorCipherOrder On
        SSLCompression off
        # Add six earth month HSTS header for all users...
        Header add Strict-Transport-Security "max-age=15768000"
        SSLCipherSuite EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA 

         ErrorLog /var/log/apache2/example.org.error.log
         LogLevel warn
         CustomLog /var/log/apache2/example.org.access.log combined
</VirtualHost>

Laut Thomas Leister muss ab Apache 2.4.8 auf die Chain-Datei verzichtet werden. Die entsprechenden Zeilen sehen dann wie folgt aus:

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.org/fullchain.pem # statt cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.org/privkey.pem

Nach einem

sudo service apache2 reload

sollte die Konfiguration laufen und die Seite unter https://example.org erreichbar sein.

Cron-Job für die Aktualisierung

Da die Zertifikate nach drei Monaten ablaufen, müssen die dann neu erstellt werden. Let's Encrypt bietet das vollautomatisch an. Es reicht ein Cronjob als root:

0 3 * * * /root/letsencrypt/letsencrypt-auto renew > /dev/null 2>&1

Let's Encrypt überspringt dabei Zertifikate, die noch gültig sind und aktualisiert nur diejenigen, die abgelaufen sind.