Let’s Encrypt auf einem Cloud Server mit acme.sh automatisieren

Die Zertifizierungsstelle Let’s Encrypt bietet die Möglichkeit, TLS/SSL-Zertifikate kostenfrei und automatisiert für Server zu beziehen. Ein Nachteil von Let’s Encrypt ist die vergleichsweise kurze Gültigkeitsdauer der Zertifikate. Dieser Nachteil lässt sich durch die Verwendung einer Software ausgleichen, welche die Erneuerung der Zertifikate auf dem Server automatisch vornimmt. Eine hierfür geeignete Software ist acme.sh. In diesem Artikel wird beispielhaft anhand des Apache Webservers gezeigt, wie acme.sh auf einem hosting.de Cloud Server in Kombination mit Apache oder Nginx als Webserver eingerichtet werden kann. acme.sh kommt mit Standard Linux Systemwerkzeugen aus und ist im Wesentlichen ein Shell-Skript. Als Alternative zu acme.sh existiert “certbot”, das Python benötigt, aber mehr Komfort bietet. In diesem separaten Artikel ist die Installation von certbot beschrieben.

Voraussetzungen

  • Sie verfügen über einen hosting.de Cloud Server, welcher einen gültigen DNS-Eintrag, z.B. mustermann-domain.de besitzt.

  • Das Betriebssystem des Servers ist ein aktuelles Debian oder Ubuntu.

Installation von Apache oder Nginx

Als Webserver können in dieser Anleitung entweder Apache oder Nginx verwendet werden. Falls Apache verwendet werden soll, installieren Sie diesen bitte mit folgenden Befehlen, falls dieser noch nicht installiert ist:

apt update
apt install apache2

Für Nginx wählen Sie anstelle des Paket apache2 bitte das Paket nginx.

Damit der Server aus dem Internet erreichbar ist, müssen der Port 80 und 443 in der Firewall freigegeben sein.

Installation von acme.sh

Das acme.sh Skript kann über den folgenden Befehl installiert werden:

curl https://get.acme.sh | sh

hierfür sind root-Rechte notwendig, wenn die weiteren in dieser Anleitung vorgeschlagenen Befehle verwendet werden sollen. Starten Sie nachdem der Befehl durchgelaufen ist bitte die aktuelle Shell neu. Falls Sie die bash als Shell verwenden, geben Sie bitte bash ein. Falls Sie die zsh verwenden, geben Sie bitte zsh ein. Anschließend steht der Befehl acme.sh in Ihrer Standard-Shell zur Verfügung.

Eine Beispielkonfiguration für Apache

Um ein Zertifikat zu beantragen kann der folgende Befehl im Apache Modus verwendet werden:

acme.sh --issue --apache -d mustermann-domain.de

Über den Parameter -d wird die Domain angegeben, für die ein Zertifikat beantragt werden soll. Es ist auch möglich über mehrere -d Parameter mehrere Domains anzugeben. Die erhaltenen Zertifikate werden im Home-Verzeichnis des aktuellen Benutzers unter ~/.acme.sh/ in einem Unterverzeichnis zur jeweiligen Domain abgelegt.

Es muss ein Verzeichnis erstellt werden, in dem die Zertifikate für Apache hinterlegt werden sollen, z.B. so:

mkdir /etc/apache2/ssl/

Dann können mit Hilfe von acme.sh die Zertifikate in das neue Verzeichnis installiert werden:

acme.sh --install-cert -d mustermann-domain.de \
--cert-file /etc/apache2/ssl/mustermann-domain.de-cert.pem \
--key-file /etc/apache2/ssl/mustermann-domain.de-key.pem \
--fullchain-file /etc/apache2/ssl/letsencrypt.pem \
--reloadcmd "systemctl reload apache2"

Anschließend muss die Konfiguration des Apache Webservers angepasst werden, sodass dieser die Zertifikate verwendet. Löschen Sie dazu bitte bei einer frischen Debian Installation alle Dateien und Symlinks im Verzeichnis /etc/apache2/sites-enabled/:

rm /etc/apache2/sites-enabled/*

Dann kann die Datei /etc/apache/sites-available/mustermann.conf mit folgendem Inhalt angelegt werden:

# this configuration requires mod_ssl, mod_socache_shmcb, mod_rewrite, and mod_headers
<VirtualHost *:80>
    RewriteEngine On
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    SSLEngine on

    SSLCertificateFile      /etc/apache2/ssl/mustermann-domain.de-cert.pem
    SSLCertificateKeyFile   /etc/apache2/ssl/mustermann-domain.de-key.pem
    SSLCertificateChainFile /etc/apache2/ssl/letsencrypt.pem

    # enable HTTP/2, if available
    Protocols h2 http/1.1

    # HTTP Strict Transport Security (mod_headers is required) (63072000 seconds)
    Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>

# intermediate configuration, tweak to your needs
SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"

Für diese Konfiguration wird das headers Modul in Apache benötigt. Dieses kann mit dem Befehl

a2enmod ssl socache_shmcb rewrite headers

aktiviert werden.

Die neu hinterlegte Konfiguration muss in Apache mit dem folgenden Befehl aktiviert werden:

a2ensite mustermann

Eine Beispielkonfiguration für nginx

Um ein Zertifikat bei Verwendung des nginx Webservers zu beantragen kann analog zu Apache der folgende Befehl verwendet werden:

acme.sh --issue --nginx -d mustermann-domain.de

Es muss ein Verzeichnis erstellt werden, in dem die Zertifikate für Apache hinterlegt werden sollen, z.B. so:

mkdir /etc/nginx/ssl/

Dann können mit Hilfe von acme.sh die Zertifikate in das neue Verzeichnis installiert werden:

acme.sh --install-cert -d mustermann-domain.de \
--cert-file /etc/nginx/ssl/mustermann-domain.de-cert.pem \
--key-file /etc/nginx/ssl/mustermann-domain.de-key.pem \
--fullchain-file /etc/nginx/ssl/letsencrypt.pem \
--reloadcmd "systemctl reload nginx"

Im Anschluss muss die Konfiguration von nginx angepasst werden, sodass die beantragten Zertifikate genutzt werden. Löschen Sie dazu bei einer frischen Debian Installation alle Dateien bzw. Symlinks in /etc/nginx/sites-enabled:

rm /etc/nginx/sites-enabled/*

Erstellen Sie dann bitte die Datei /etc/nginx/sites-available/mustermann.conf. Eine einfache Version kann z.B. so aussehen:

server {

        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        return 301 https://$host$request_uri;

}

server {

        listen                  443 ssl http2;
        listen                  [::]:443 ssl http2;

        root                    /var/www/html;

        ssl_certificate         /etc/apache2/ssl/letsencrypt.pem;
        ssl_certificate_key     /etc/nginx/ssl/mustermann-domain.de-key.pem;

        ssl_session_timeout 1d;
        ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
        ssl_session_tickets off;

        ssl_protocols           TLSv1.2 TLSv1.3;
        ssl_ciphers             ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
        ssl_prefer_server_ciphers off;

        add_header              Strict-Transport-Security "max-age=63072000; includeSubdomains;";

        ssl_stapling on;
        ssl_stapling_verify on;

}

Erstellen Sie anschließend einen Symlink zu der Konfigurationsdatei im Verzeichnis /etc/nginx/sites-enabled:

cd /etc/nginx/sites-enabled/
ln -s ../sites-available/mustermann.conf

Starten Sie dann bitte nginx neu um die Konfiguration zu aktivieren:

systemctl restart nginx.service

Test

Für den Test der in den Webservern eingerichteten Zertifikate kann der Qualys SSL Labs Test verwendet werden. Hier sollte der Grad “A+” erreicht werden.

Die Let’s Encrypt Zertifikate sind 90 Tage gültig. Die Zertifikate werden von acme.sh automatisch alle 60 Tage erneuert. Wir empfehlen dies einmal nach 60 Tagen zu überprüfen.

Referenzen