SSL-Zertifikate mit Crypt-LE erstellen und verlängern
Bei vielen Web-Hosting- oder Shared-Hosting-Tarifen größerer Anbieter wird oft keine Integration von Let’s Encrypt zur Verfügung gestellt. Damit ist es leider nicht möglich kostenlose SSL-Zertifikate direkt beim Hoster zu erstellen und automatisch zu verlängern. Es besteht dann aber eventuell die Möglichkeit eigene SSL-Zertifikate hochzuladen und damit auch wieder die Möglichkeit extern erstellte Let’s Encrypt SSL-Zertifikate zu nutzen. Die Let’s Encrypt SSL-Zertifikate können also über einen Online-Service oder lokal auf einem Computer erstellt und anschließend im Backend des Hosters hochgeladen werden.
Für die Erstellung eines Let’s Encrypt SSL-Zertifikats wird ein sogenannter ACME-Client benötigt. Dieser kann über einen Online-Service oder über eine Anwendung auf dem Webserver oder lokalen Computer zur Verfügung stehen. Mit dieser Anwendung kann über das ACME-Protokoll automatisch ein SSL-Zertifikat erstellt und zukünftig auch verlängert werden. Ein wichtiger Bestandteil des ACME-Clients ist die automatische Überprüfung der Inhaberschaft bzw. ausreichenden Administration der Domain.
In diesem Artikel erfährst du wie kostenlose SSL-Zertifikate lokal auf einem Computer mit dem ACME-Client Crypt-LE erstellt werden können. Der Vorteil von Crypt-LE bzw. einer lokalen Anwendung gegenüber einem Online-Service ist die Geheimhaltung des privaten Schlüssels gegenüber Drittanbietern. Bei einem Online-Service besteht immer die Möglichkeit dass der private Schlüssel dort gespeichert bleibt. Bei der lokalen Erstellung eines SSL-Zertifikats verbleibt der private Schlüssel auf dem Computer. Der private Schlüssel wird später zusammen mit dem SSL-Zertifikat dem Hoster mitgeteilt, so dass dieser eine sichere Verbindung für die entsprechende Domain einrichten kann.
Was ist Crypt-LE?
Crypt-LE ist eine Anwendung oder auch ein Perl-Modul um kostenlose SSL-Zertifikate von Let’s Encrypt oder anderen ACME-Anbietern (z.B. Buypass Go SSL) zu erstellen und zu verlängern. Crypt-LE liefert dabei alle Möglichkeiten um die benötigten RSA- oder ECC-Schlüssel sowie auch die Zertifikatsignierungsanforderung (Certificate Signing Request) zu erstellen. Es können Multi-Domain- und Wildcard-Zertifikate erstellt werden. Die Verifizierung der Domain ist über die Methoden DNS oder HTTP direkt über Crypt-LE möglich. Crypt-LE ist kostenfrei und kann unter Linux, MacOS, Docker und Windows verwendet werden. Crypt-LE steht als native Windows-Anwendung zur Verfügung. Damit wird unter Windows keine virtuelle Maschine oder WSL (Windows Subsystem for Linux) benötigt.
Crypt-LE unter Windows einrichten
Die native Windows-Anwendung von Crypt-LE kann vom offiziellen GitHub-Repository heruntergeladen werden. Es steht eine 32-bit und eine 64-bit Variante der Anwendung zur Verfügung. Die über ein ZIP-Archiv zur Verfügung gestellte Anwendung muss nur an den gewünschten Speicherort auf dem Computer entpackt werden. Eine Installation von Crypt-LE ist nicht nötig (und auch nicht möglich).
Tipp: Für die einfache Verwendung von Crypt-LE kann der Speicherort in der Umgebungsvariable “Path” von Windows hinzugefügt werden. Damit kann Crypt-LE aus jedem Verzeichnis und in jedem Skript direkt mit dem Namen verwendet werden, ohne den gesamten Pfad zum Speicherort angeben zu müssen.
SSL-Zertifikat mit Crypt-LE erstellen
Die Erstellung eines SSL-Zertifikats mit Crypt-LE unterscheidet sich je nach Anbieter des ACME-API-Endpunkts. Standardmäßig werden mit Crypt-LE SSL-Zertifikate von der Zertifizierungsstelle Let’s Encrypt erstellt. Durch die Angabe des Parameters -server
kann aber auch ein anderer Anbieter wie Buypass verwendet werden.
Hinweis: In den beschriebenen Skripten wird die 64-bit Variante von Crypt-LE (also “le64”) verwendet. Wenn die 32-bit Variante verwendet werden soll, muss der Name der Anwendung “le64” durch “le32” ersetzt werden. Es ist außerdem darauf zu achten die E-Mail-Adresse sowie die Domain(s) richtig anzugeben. In den Skripten und Screenshots werden nur Beispielinformationen verwendet. Eine Erklärung der verwendeten Parameter befindet sich am Ende des Artikels.
SSL-Zertifikat von Let’s Encrypt erstellen
Mit dem folgenden Skript kann ein SSL-Zertifikat von Let’s Encrypt erstellt werden. Die Verifizierung der Domain wird in diesem Fall über DNS durchgeführt. Nur mit einer DNS-Verifizierung kann auch ein Wildcard-Zertifikat erstellt werden. Nach erfolgreicher Verifizierung muss diese zukünftig nicht mehr durchgeführt werden. Bei der ersten Ausführung des Skripts werden die über die Parameter -csr
, -cry-key
und -key
angegebenen Dateien erstellt. Dazu sollte auch der Parameter -generate-missing
angegeben werden. Wenn eine dieser Dateien zukünftig fehlen sollte, muss eine erneute Verifizierung der Domain durchgeführt werden.
Über den Parameter -domains
können die Domains angegeben werden welche über das SSL-Zertifikat abgesichert werden sollen. Bei der Angabe der Wildcard-Domain (*.example.com) sollte auch die Stammdomain (example.com) angegeben werden, da diese nicht über die Wildcard abgedeckt wird.
le64 -key account.key -email "ssl-test@beispieldomain.de" ^
-csr domain.csr ^
-crt domain.crt ^
-csr-key domain.key ^
-handle-as dns ^
-api 2 ^
-live ^
-generate-missing ^
-domains "ssl-beispiel-domain.de"
Nach der Erstellung der Schlüssel wird das Skript pausiert um die Verifizierung der Domain einrichten zu können. Bei einer Verifizierung über DNS müssen die in Crypt-LE angezeigten DNS-Einträge mit entsprechendem Wert erstellt werden. Bevor die Verifizierung durch Crypt-LE mit Enter gestartet wird können die DNS-Informationen zuvor auch selbst überprüft werden. Damit kann sichergestellt werden dass die DNS-Einträge richtig erstellt wurden und auch erreichbar sind.
In dem folgenden Screenshot ist nochmals der vollständige Ablauf der Erstellung eines Let’s Encrypt SSL-Zertifikats zu sehen. Dort ist auch die Pause (Leerzeile in der Ausgabe) erkennbar, in welcher die Prüfung der Domain vorbereitet wurde.
Bei der erfolgreichen Erstellung des SSL-Zertifikats wird dieses in der im Parameter -crt
angegebenen Datei gespeichert. Für die Einrichtung des SSL-Zertifikats bei einem Hoster oder auf einem Server werden die in den Parametern -crt
und -csr-key
angegebenen Dateien benötigt. Diese Dateien können beispielsweise in der SSL-Administration des Hosters für die entsprechende Domain hochgeladen werden.
SSL-Zertifikat von Buypass erstellen
Buypass ist eine norwegische Zertifizierungsstelle welche mit Hilfe des ACME-Protokolls einen ACME-API-Endpunkt für die Erstellung und Verlängerung von kostenlosen SSL-Zertifikaten ermöglicht. Eine Besonderheit dieser SSL-Zertifikate ist die deutlich längere Gültigkeit von 180 Tagen statt 90 Tagen bei Let’s Encrypt. Die Buypass Go SSL-Zertifikate können ebenfalls über Crypt-LE erstellt werden.
Dazu muss aber zusätzlich der Parameter -server
mit einer der folgenden URLs angegeben werden. Die Verwendung des Produktiv- oder Testbereichs wird nur über die entsprechende URL definiert. Daher ist in diesem Fall auch die Angabe des Parameters -live
optional.
- Produktivbereich: https://api.buypass.com/acme
- Testbereich: https://api.test4.buypass.no/acme
Das folgende Skript kann zur Erstellung eines Buypass Go SSL-Zertifikats verwendet werden. Dieses unterscheidet sich nur durch den Parameter -server
vom Skript welches für die Erstellung eines Let’s Encrypt SSL-Zertifikats verwendet wurde.
le64 -key account.key -email "ssl@beispieldomain.de" ^
-csr domain.csr ^
-crt domain.crt ^
-csr-key domain.key ^
-handle-as dns ^
-server "https://api.buypass.com/acme" ^
-live ^
-generate-missing ^
-domains "ssl-beispiel-domain.de"
In dem folgenden Screenshot ist nochmals der vollständige Ablauf der Erstellung eines Buypass Go SSL-Zertifikats zu sehen. Dort ist auch die Pause (Leerzeile in der Ausgabe) erkennbar, in welcher die Prüfung der Domain vorbereitet wurde.
Wie auch bei der Erstellung eines Let’s Encrypt SSL-Zertifikats befindet sich nach erfolgreicher Erstellung des SSL-Zertifikats dieses in der im Parameter -crt
angegebenen Datei. Die in den Parametern -crt
und -csr-key
angegebenen Dateien werden für die Einrichtung des SSL-Zertifikats benötigt.
SSL-Zertifikat mit Crypt-LE verlängern
Die Verlängerung eines SSL-Zertifikats über Crypt-LE findet mit dem gleichen Skript statt welches auch bei der Erstellung verwendet wurde. Theoretisch kann hierzu einfach nochmals das gleiche Skript ausgeführt werden. Im Falle einer Automatisierung sollte jedoch der Parameter -renew
verwendet werden. Über diesen Parameter können die noch verbleibenden Tage definiert werden, ab welchen eine Verlängerung des SSL-Zertifikats stattfinden soll. Let’s Encrypt empfiehlt eine Verlängerung bei einer verbleibenden Gültigkeit von 30 Tagen. Also kann dem ursprünglichen Skript noch der Parameter -renew 30
angefügt werden. Bei der Ausführung des Skripts wird nun nur noch ein SSL-Zertifikat erstellt wenn das aktuelle SSL-Zertifikat eine verbleibende Gültigkeit von 30 Tagen oder weniger hat.
le64 -key account.key -email "ssl-test@beispieldomain.de" ^
-csr domain.csr ^
-crt domain.crt ^
-csr-key domain.key ^
-handle-as dns ^
-api 2 ^
-live ^
-generate-missing ^
-domains "ssl-beispiel-domain.de" ^
-renew 30
Im nachfolgenden Screenshot ist der Ablauf einer Verlängerung zu sehen. Eine erneute Überprüfung der Domain ist nicht notwendig solange alle Schlüssel (die in den Parametern -csr
, -csr-key
und -key
angegebenen Dateien) vorhanden sind.
Überprüfen der DNS-Informationen
Für die Verifizierung der Domain muss beim Hoster für die Sub-Domain _acme-challenge ein TXT-Record mit einem bestimmten Wert erstellt werden. Um vor der Verifizierung durch Crypt-LE den DNS-Eintrag zu überprüfen, kann das Tool nslookup
verwendet werden. Im nicht interaktiven Modus des Tools kann der DNS-Eintrag mit dem folgenden Befehl ermittelt und überprüft werden:
nslookup -q=TXT _acme-challenge.example.com
Auch über den interaktiven Modus können die Informationen des DNS-Eintrags ermittelt und überprüft werden:
nslookup
> set type=TXT
> _acme-challenge.example.com
Nach der Ausführung der Abfrage wird der im DNS-Eintrag hinterlegte Wert angezeigt. Wird kein Wert angezeigt oder ist die Domain nicht bekannt sollte der DNS-Eintrag beim Hoster nochmals überprüft werden. Andernfalls, wenn alle Informationen beim Hoster richtig angegeben wurden, kann es einige Minuten oder sogar Stunden dauern, bis die Domain sichtbar ist.
Erklärung der verwendeten Parameter
-api
Bei der Verwendung von Let’s Encrypt als Zertifizierungsstelle (also ohne den Parameter -server
) kann mit diesem Parameter die ACME-Version angegeben werden, welche zur Erstellung oder Verlängerung des SSL-Zertifikats verwendet werden soll. Hier sollte immer die aktuell von Let’s Encrypt empfohlene Version eingesetzt werden. Aktuell wird die Version 2 empfohlen. Die Version 1 wird zukünftig von Let’s Encrypt nicht mehr unterstützt. Dieser Parameter kann bei der Verwendung des Parameters -server
weggelassen werden.
-crt
Die in diesem Parameter angegebene Datei enthält das eigentliche SSL-Zertifikat, welches von der Zertifizierungsstelle erstellt wurde. Bei einer erfolgreichen Erstellung oder Verlängerung wird diese Datei immer erstellt oder aktualisiert. Diese Datei wird zusammen mit dem privaten Schlüssel des Zertifikats (-csr-key
) für die Einrichtung beim Hoster benötigt.
-csr
Die Datei mit der Zertifikatsignierungsanforderung (Certificate Signing Request; CSR) wird mit diesem Parameter angegeben. In dieser Datei werden alle Informationen für die Zertifizierungsstelle zur Verfügung gestellt um damit ein entsprechendes SSL-Zertifikat erstellen zu können. Darin sind beispielsweise die Domains enthalten welche über den Parameter -domains
angegeben wurden.
-csr-key
Über diesen Parameter wird der private Schlüssel der Domain angegeben. Dieser Schlüssel muss bei der Einrichtung des SSL-Zertifikats beim Hoster zusammen mit dem eigentlichen Zertifikat (-crt
) angegeben werden. Die Datei wird auch oft als Domain-Schlüssel bezeichnet.
-domains
Die über das SSL-Zertifikat zu berücksichtigenden Domains können über diesen Parameter angegeben werden. Bei einem Wildcard-Zertifikat muss beachtet werden dass über die Wildcard-Domain nicht die Stammdomain abgesichert wird. Diese muss zusätzlich als sogenannter Subject Alternative Name (SAN) angegeben werden. Nachfolgend ein paar Beispiele wie die Domain(s) angegeben werden sollten.
- Stammdomain und www Sub-Domain:
-domains "example.com,www.example.com"
- Wildcard-Domain und Stammdomain:
-domains "*.example.com,example.com"
- nur Sub-Domain:
-domains "sub.example.com"
-email
Die Zertifizierungsstelle kann eine Benachrichtigung per E-Mail versenden, bevor ein darüber erstelltes SSL-Zertifikat abläuft. Über diesen Parameter kann die E-Mail-Adresse für die Benachrichtigung angegeben werden.
-generate-missing
Bei der Erstellung eines SSL-Zertifikats oder der erstmaligen Verwendung einer Zertifizierungsstelle mit ACME-API-Endpunkt müssen evtl. verschiedene Schlüssel erzeugt werden. Mit diesem Parameter können die noch nicht vorhandenen Schlüssel automatisch erstellt werden. Der private Schlüssel der Domain (-csr-key
), der Account-Schlüssel für den ACME-API-Endpunkt (-key
) sowie die Zertifikatsignierungsanforderung (-csr
) werden, wenn nicht vorhanden, bei Angabe dieses Parameters erstellt. Wenn die Dateien bereits vorhanden sind, werden diese nicht verändert und zur Erstellung oder Verlängerung des SSL-Zertifikats direkt verwendet.
-handle-as
Um ein SSL-Zertifikat für eine Domain erstellen zu können muss eine Bestätigung der Domain durchgeführt werden. Hierfür stehen grundlegend die Optionen “dns” und “http” zur Verfügung. Für die Erstellung eines Wildcard-Zertifikats muss eine Verifizierung über DNS durchgeführt werden. Bei vielen Hostern besteht inzwischen die Möglichkeit die DNS-Einträge ohne Support-Ticket anzupassen und damit auch eine Verifizierung über DNS durchzuführen.
-help
Crypt-LE liefert bereits selbst eine sehr gute, englischsprachige Dokumentation welche mit diesem Parameter aufgerufen werden kann. In dieser Dokumentation finden sich diverse Beispiele und Möglichkeiten Crypt-LE zu verwenden. Eine Liste aller verfügbaren Parameter ist dort ebenfalls mit einer kurzen Beschreibung zu finden. Die Dokumentation im GitHub-Repository liefert zusätzlich auch viele nützliche Informationen und Beispiele.
-key
Für die Authentifizierung am ACME-API-Endpunkt wird ein Account-Schlüssel benötigt. Die Datei mit dem Account-Schlüssel kann über diesen Parameter angegeben werden. Der Account-Schlüssel sollte nicht mit dem Domain-Schlüssel verwechselt werden. Der Account-Schlüssel muss bei der Erstellung eines neuen SSL-Zertifikats nicht vorhanden sein. Es sollte in diesem Fall aber zusätzlich der Parameter -generate-missing
angegeben werden, damit der fehlende Account-Schlüssel erstellt werden kann.
-live
Wenn Crypt-LE mit der Zertifizierungsstelle Let’s Encrypt (also ohne den Parameter -server
) verwendet wird, kann mit diesem Parameter festgelegt werden ob der Produktivbereich für die Erstellung und Verlängerung des SSL-Zertifikats verwendet werden soll. Wird dieser Parameter nicht angegeben so wird ein SSL-Zertifikat erstellt welches von den Browsern als nicht vertrauenswürdig erkannt wird. Die Erstellung und Verlängerung eines SSL-Zertifikats im Produktiv- und Testbereich funktioniert aber ansonsten identisch.
-renew
Die Verlängerung eines SSL-Zertifikats kann mit dem gleichen Skript durchgeführt werden welches auch bei der Erstellung verwendet wurde. Mit dem zusätzlichen Parameter -renew
können die noch verbleibenden Tage angegeben werden ab welchen eine Verlängerung tatsächlich durchgeführt werden soll.
-server
Standardmäßig verwendet Crypt-LE die Zertifizierungsstelle Let’s Encrypt zur Erstellung und Verlängerung von SSL-Zertifikaten. Um aber auch andere Zertifizierungsstellen wie Buypass Go SSL verwenden zu können, besteht über den Parameter -server
die Möglichkeit die URL zum ACME-API-Endpunkt anzugeben.
Ein großes Dankeschön Sebastian Brosch für diesen hilfreichen Beitrag. Ich hatte zuvor ZeroSSL und musste mich nun nach 3 kostenfreien Zertifikaten nach einem anderen möglichst einfachen Weg umschauen. Dieser hier ist fast noch simpler als ZeroSSL. Von daher top! Nochmal: vielen Dank!
Freut mich wenn ich helfen konnte. Wenn man einmal die Scripte erstellt hat ist die Verlängerung der SSL-Zertifikate tatsächlich sehr einfach und unkompliziert.
Hallo Sebastian!
Erstmal danke für das Tutorial! Vielleicht stelle ich mich nur ungeschickt an, aber wie kann ich diese Dateien (account.key, domain.csr, domain.key) jetzt einsetzen, um ein Zertifikat z.B. in einem NAS von Synology zu haben? Dort wird nach “Privater Schlüssel – Zertifikat – Zwischenzertifikat” gefragt.
Danke für die Hilfe!
Uli
Die Dateien
account.key
unddomain.csr
werden nur für die Erstellung eines SSL-Zertifikats benötigt. Für die Einrichtung im Synology NAS werden die Dateiendomain.crt
unddomain.key
benötigt, soweit ich das richtig sehe. Die Dateidomain.key
sollte als Privater Schlüssel und die Dateidomain.crt
als Zertifikat hinterlegt werden. Das Zwischenzertifikat sollte optional sein und muss daher nicht angegeben werden.Ich kenne mich mit dem Synology NAS nicht aus aber so wie es aussieht sollte sich ein Let’s Encrypt Zertifikat auch direkt über die Administration des NAS erstellen lassen. Ich habe hierzu mehrere Artikel gefunden wobei der Folgende vielleicht helfen könnte:
https://www.antary.de/2016/03/25/lets-encrypt-zertifikate-auf-synology-nas-einrichten/
Hallo Sebastian,
vorab vielen Dank für den interessanten Artikel und die Hilfe.
Funktioniert alles ganz wunderbar, wenn man es 1:1 umsetzt.
Das Einzige, was bei mir nicht funktioniert, sind Wildcards, wenn ich die Server-Option nutze.
Dann erhalte ich schlussendlich “Failed to receive the challenge. Expected JWS header is missing: jwk” anstelle des DNS-Eintrages.
Wenn ich Wildcards ohne Server-Option nutze, klappt alles prima, aber dann natürlich nur für 3 Monate.