Let’s Encrypt via acme.sh für Apache und Nginx

Ende 2015 bin ich auf das Thema Webserver SSL Optimierung: HSTS und HPKP eingegangen. Nun möchte ich euch ein kleines Update zu Let’s Encrypt mit dem acme.sh Script für Apache und Nginx geben. Die Anleitung basiert auf dem ACME Webroot Verfahren, ein Stoppen des Webservers wie beim Standalone Verfahren ist nicht nötig.

Apache2

Punkt 1: Apache Webserver vorbereiten

Wir aktivieren zuerst das Headers, SSL und Rewrite Modul.

Erstellen eine globale Alias Datei (gültig für alle vHosts).

oder für Apache >=2.4

Bei der 2. Variante aktivieren wir die Konfiguration noch.

Jetzt legen wir den Alias-Ordner an und verteilen die korrekten Rechte.

Die CipherSuite wird auf einen aktuellen Stand gebracht (hier gibt es aktuelle Ciphers cipherli.st).

Apache neustarten.

Punkt 2: Let’s Encrypt: acme.sh

Wir installieren acme.sh. Dies ist ein schlankes Shell Script welches jede Let’s Encrypt Funktion wie issue, renew, cronjob etc. mit sich bringt. Es wird automatisch ein Cronjob angelegt der täglich ein renew für alle Domains anfragt.

Einen Ordner für die Zertifikate legen wir in folgender Datei fest, ich empfehle den bereits vorhandenen Ordner /etc/ssl/private.

Wir schließen das Konsolenfenster und verbinden uns zum Server neu, um die Umgebungsvariable von acme.sh zu laden. Das Script ist nun direkt ausführbar.

Punkt 3: Zertifikat erstellen

Beginnen wir mit einem Test, die obigen Einstellungen sollten zuerst immer mit „–test“ geprüft werden. Let’s Encrypt lässt nur 5 Versuche in 7 Tagen zu, danach ist die Domain temporär gesperrt. Ich empfehle in diesem Zuge von 2048-Bit oder 4096-Bit RSA Keys gleich auf das modernere ec-256 (ECDSA P-256) zu wechseln. Zum einen bringt dies eine höhere Sicherheit und zum anderen sind die Keys kürzer und somit performanter.

TIPP: Wenn der Alias /var/www/letsencrypt nicht funktioniert, könnt ihr auch den DocumentRoot verwenden.

Sollte die Verifizierung erfolgreich gewesen sein, findet ihr folgende Dateien wieder.

Diesen Ordner können wir löschen, da mit „–test“ die Staging API von Let’s Encrypt genutzt wird und nur Fake Zertifikate ausgestellt werden.

Das echte Zertifikat kann nun ausgestellt werden. (--force um das Testzertifikat zu überschreiben)

Punkt 4: Zertifikat in Apache einbinden

Wir editieren unsere vHost Config und fügen das soeben erstelle Zertifikat sowie Security Headers ein.

Ich möchte an dieser Stelle darauf hinweisen, dass ich Public Key Pinning (HPKP) in dieser Anleitung bewusst außenvor lasse um ein eventuelles Aussperren von Besuchern zu verhindern. Wer sich dieser Gefahr bewusst ist, kann gerne meiner Anleitung folgen.

Apache neustarten.

Das Ergebnis prüfen wir auf SSL Labs und Security Headers.

 

nginx

Punkt 1: Nginx Webserver vorbereiten

Wir erstellen die nötigen Ordner und eine globale Datei die in jeden vHost „included“ wird. Das vereinfacht späteres Anpassen.

Für die globalen SSL Einstellungen legen wir ebenfalls eine Datei an. Die Ciphers werden auf einen aktuellen Stand gebracht (hier gibt es aktuelle Ciphers cipherli.st). Auch die Security Headers werden hier hinterlegt.

Falls noch nicht vorhanden, legen wir eine dhparams Datei an.

Nginx neustarten.

Punkt 2: Let’s Encrypt: acme.sh

Wir installieren acme.sh. Dies ist ein schlankes Shell Script welches jede Let’s Encrypt Funktion wie issue, renew, cronjob etc. mit sich bringt. Es wird automatisch ein Cronjob angelegt der täglich ein renew für alle Domains anfragt.

Einen Ordner für die Zertifikate legen wir in folgender Datei fest, ich empfehle den bereits vorhandenen Ordner /etc/ssl/private.

Wir schließen das Konsolenfenster und verbinden uns zum Server neu, um die Umgebungsvariable von acme.sh zu laden. Das Script ist nun direkt ausführbar.

Punkt 3: Zertifikat erstellen

Beginnen wir mit einem Test, die obigen Einstellungen sollten zuerst immer mit „–test“ geprüft werden. Let’s Encrypt lässt nur 5 Versuche in 7 Tagen zu, danach ist die Domain temporär gesperrt. Ich empfehle in diesem Zuge von 2048-Bit oder 4096-Bit RSA Keys gleich auf das modernere ec-256 (ECDSA P-256) zu wechseln. Zum einen bringt dies eine höhere Sicherheit und zum anderen sind die Keys kürzer und somit performanter.

TIPP: Wenn die Location /var/www/letsencrypt nicht funktioniert, könnt ihr auch den Root verwenden.

Sollte die Verifizierung erfolgreich gewesen sein, findet ihr folgende Dateien wieder.

Diesen Ordner können wir löschen, da mit „–test“ die Staging API von Let’s Encrypt genutzt wird und nur Fake Zertifikate ausgestellt werden.

Das echte Zertifikat kann nun ausgestellt werden. (--force um das Testzertifikat zu überschreiben)

Punkt 4: Zertifikat in Nginx einbinden

Wir editieren unsere vHost Config und fügen das soeben erstelle Zertifikat sowie Security Headers ein.

Ich möchte an dieser Stelle darauf hinweisen, dass ich Public Key Pinning (HPKP) in dieser Anleitung bewusst außenvor lasse um ein eventuelles Aussperren von Besuchern zu verhindern. Wer sich dieser Gefahr bewusst ist, kann gerne meiner Anleitung folgen.

Nginx neustarten.

Das Ergebnis prüfen wir auf SSL Labs und Security Headers.

UnterstützenDas Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld.
Unterstütze unsere Arbeit mit einer Spende.
1

dominion

Linux Systemadministrator

Das könnte dich auch interessieren …

7 Antworten

  1. Heinzi sagt:

    Deine Anleitung hat mir echt weitergeholfen!
    Als Anfänger ist allerding der Beispielordner „/var/www/letsencrypt“ recht verwirrend, da der Name des Ordners „letsencrypt“ nichts mit Letsencrypt zu tun hat.
    Der Ordner könnte auch „/var/www/beispiel“ heißen und zur URL http://www.beispiel.de gehören.

    Hoffe meine Bemerkung hilft andern weiter.

  2. guten tag. ich danke dir sehr!
    endlich eine anleitung, die ich verstehe 😉
    ich habe apache2 (ubuntu 16.04).

    es gibt ein paar kleine winzigkleine unlogeleien bezüglich apache2.4
    /etc/apache2/conf.d/letsencrypt.conf versus /etc/apache2/conf-available/letsencrypt.conf
    ich würde in beispielen nicht das alte UND zeitgleich das neue apache erwähnen. mann sieht es ja an der überschrift, welches der beiden apachen gemeint ist!
    was vielleicht fehlen könnte, ist der hinweis, was mache ich denn, wenn ich schon meine tests habe, wie kille ich die. wie errichte ich dann neue certs, wie melde ich die an. wenn man vesteht, daß das in drei von einander ubhängigen schritten ablaufen muss/kann. dann hat man viel versdanden 😉
    deshalb bei mir 4 schritte:
    1. acme.sh –remove -d…
    2. acme.sh –issue -k ec-256 –apache -d…
    3. acme.sh –install-cert –ecc -k ec-256 –apache -d…
    4. acme.sh –install-cronjob -k ec-256 –apache -d…

    ich verwende gerne in meinen skripten platzhalter. z.b. :
    export s=“domain.de“
    export a=“/etc/apache2″
    man verkürzt sich seine skripte damit! und ich erledige in einem aufruf 1xdomain und dafür 4sibdomains.
    was auch schön ist, zu erwähnen: ich plaziere die schlüssel gleich mit dem befehl an die stelle, wo sie der übersichthalber „hingehören“.
    –cert-file $a/$s.cert.pem –key-file $a/$s.key.pem –ca-file $a/$s.ca.pem –fullchain-file $a/$s.fullchain.pem
    vielleicht, wenn DU möchtest, werde ich dir die dateien schicken (meine 4 scripte, sie sind fast selbsterklärend 😉
    danke, danke erstmal!
    viele grüße, klaus lehmann

    • Dominion sagt:

      Vielen Dank für deine Anregungen. Ich habe ein --force hinzugefügt, damit die Testzertifikate einfach überschrieben werden können.
      Die Anleitung soll nur als Grundlage dienen, jede weitere Konfiguration kann ein Admin gerne selbst durchführen 😉

      Deine Skripte sind willkommen, kannst du mir gerne schicken.

  3. Dominion, danke für Deine Antwort! Aber ich muß dem widersprechen: „Die Anleitung soll nur als Grundlage dienen, jede weitere Konfiguration kann ein Admin gerne selbst durchführen“.
    Naja.Iich denke schon, daß ich ein solcher „admin“ bin, betreibe ich doch seit 2003 meine 3-7 eigenen Server, alle volle root-server auf linux. aber wenn ich die doku (das wiki) oder die –help zeile zu acme.sh sehe, und VERSUCHE sie zu verstehen. naja.
    es ist alles so ziemlich mehrdeutig oder „ohne deutigkeit“ formuliert. wo steht denn z.b. drin, wie ich meine domian und die 4 subdomains um weitere subdomains ergänzen kann? das findet man nicht! ausprobieren? oh ja: GERNE! nur nach 5 versuchen innnerhalb 7 tagen wirst DU rausgekickt!
    Die dt. Doku, die DU, lieber Dominion schon 2016 veröffentlichst hast, ist a. sehr gut, und b. sie funktioniert (DAS ist keine selbstverständlichkeit! bei dem Müll, der in blogs und Konsorten geschrieben). und mir wäre es sehr lieb, wenn man hier (gute) fragen stellen kann, und auch andere ihren senf beitragen 😉
    Nächster (mein) Beitrag zum Thema: „Wie erweitere ich meine vorhandene Domain um weitere Subdomains“
    Grüße, Klaus Lehmann
    PS: in der c’t 2018/4 steht was zum neuen acme-protokoll drin, sowie zum neuen mod in apache. Wer !genau! liest, sieht beim Protokoll 2.0 und acme.sh die Einschränkung (Stichwort DNS). und apache’s mod_md ist nicht ausgereift und es ist keine Selbstverständlichkeit, es in ältere apache2 integriert zu bekommen.
    allet nich so einfach, nee nich…..

  4. Beitrag zum Thema: „Wie erweitere ich meine vorhandene Domain um weitere Subdomains“

    hm. ich machte die erfahrung, das das alles ganz doll und tolle geklappt hatte.
    ups, ich hatte 2 subdmänen vergessen.
    was habe ich nun gemacht? es steht auch nicht beim originalwiki, wie man „das vorhandene“ um „weitere subdomänen“ ergänzt!
    also habe ich es so gemacht, in dem ich schrieb: (logisch tztztz denkend)
    mmz und psb sind meine NEUEN domänen! die hauptdomäne ist zzzdomainzzz.de …

    /root/.acme.sh/acme.sh –issue -k ec-256 –apache -d http://www.zzzdomainzzz.de -d zzzdomainzzz.de -d mmz.zzzdomainzzz.de -d http://www.mmz.zzzdomainzzz.de -d psb.zzzdomainzzz.de -d http://www.psb.zzzdomainzzz.de –cert-file $a/zzzdomainzzz.de.cert.pem –key-file $a/zzzdomainzzz.de.key.pem –ca-file $a/zzzdomainzzz.de.ca.pem –fullchain-file $a/zzzdomainzzz.de.fullchain.pem –webroot /home/zzzdomainzzz.de/public_html –force –ecc –reloadcmd „service apache2 force-reload“

    das hatte zum ergebnis: die vorhandenen alten subdomänen wurden alle gelöscht!
    die domäne „zzzdomainzzz.de“ selber nicht!
    autsch!

    die erfahrung: dat janze nochmal! aufs neue!
    1. /root/.acme.sh/acme.sh –issue -k ec-256 –apache -d http://www.zzzdomainzzz.de -d zzzdomainzzz.de mit allen ALTEn und NEUEN subdomänen!
    es hat zumindestens geklappt!
    wer ein besseres/kürzeres rezept hat, widerspreche mir BITTE liebendgern!
    2. immer im hinteren kopfe: fünef versuche pro sieben tager sind erlaubt! mehr iss nicht!

    gruezi, vom klaus(i)

  5. Matthias R sagt:

    Ich muss meinen Server (nginx based) auf einen anderen Provider umziehen und bin mir nicht sicher ob es reicht auf dem neuen Zielsystem einfach nur acme.sh (läuft bei mir unter eigenem User) zu installieren und danach alle Zertifikate zu kopieren. Auch ob danach noch die automatische Aktualisierung über die crontab funktioniert? Eine Idee?

    • Dominion sagt:

      Hallo Matthias,

      ja installiere dir auf dem neuen System einfach auch acme.sh. Anschließend kannst du dir die Zertifikate rüber kopieren.
      Der Cronjob erkennt automatisch die Zerts im Ordner und macht ein Renew falls nötig.

      Gruß
      Dominion

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert