Donnerstag, 8. September 2016

Let's encrypt: Domain/Subdomain hinzufügen und entfernen (U6)

In diesem Tutorial wird der Umgang und die Pflege des Let's encrypt Zertifikats erklärt. Speziell das Hinzufügen und Entfernen von Domains/Subdomains, sowie das Setzen der Zertifikats-Hauptdomain, also im Allgemeinen das Updaten des Letsencrypt-Zertifikats.

Speziell behandelt das Tutorial die Pflege des Let's encrypt Zertifikats bei Uberspace in U6 (CentOS 6).
Uberspace bindet die Nutzung des Let's encrypt Zertifikats mit allgemeinen Regeln ein. Von daher ist dieses Tutorial in Teilen auf die allgemeine Pflege des Let's encrypt Zertifikats übertragbar.

Let's encrypt bietet für so ziemlich jeden eine Möglichkeit zur Zertifizierung seiner Webseite. Let's encrypt ist ein Zertifikat, mit dem der Webseiten-Inhalt bei der Übertragung verschlüsselt wird. Allgemein bekannt unter dem Kürzel "HTTPS" (SSL).

---------------------
UPDATE (2018)
Mit Uberspace 7 (U7) werden für alle Domains automatisch Let's encrypt Zertifikate ausgestellt und erneuert.
Die Version deines Uberspaces wird in der Shell als Willkommensbotschaft angezeigt.
"Welcome to Uberspace 6!"
"Welcome to Uberspace 7!"
Oder nutze folgenden Kommandozeilenbefehl:
[$user@uberspace ~]$ cat /etc/centos-release
U6: CentOS release 6 ...
U7: CentOS Linux release 7 ...
--------------------- 
UPDATE (2017)
Uberspace hat ein neues Script entworfen, mit dem das entfernen und hinzufügen von Domains/Subdomains vereinfacht wird, wenn Let's encrypt schon besteht.

Wenn eine Domain/Subdomain hinzugefügt oder entfernt werden soll, so muss dies in der Datei
/home/$user/.config/letsencrypt/cli.ini
in der Zeile
domains =
manuell vorgenommen werden. Danach in der Kommandozeile das Script wie folgt aufrufen und ein neues Zertifikat mit den in der cli.ini angegebenen Domains/Subdomains wird erstellt.
[$user@uberspace ~]$ uberspace-letsencrypt-renew -f

ACHTUNG: Dieser Befehl erstellt ein neues Zertifikat. Dies ist nur 5 mal in 7 Tagen pro Common Name (CN) Domain möglich. Falls das Limit erreicht wurde, probiere eine andere Domain als CN. CN: Die erste Domain in der Zeile "domains =" in der cli.ini ist die Domain, die als CN verwendet wird.

Das neue Script nimmt nach erstellen eines neuen Zertifikats auch den Import des neuen Zertifikats vor und löscht gegebenenfalls veraltete Verzeichnisse.
Wenn der automatische Import nicht funktionieren sollte und diese Meldung kommt:
🚀 We can't import your certificate automatically.
 dann sollte der Import manuell vorgenommen werden, mit diesem Befehl:
[$user@uberspace ~]$ uberspace-add-certificate -k ~/.config/letsencrypt/live/example.com/privkey.pem -c ~/.config/letsencrypt/live/example.com/cert.pem
Allerdings ist hier besonderst auf den Verzeichnisnamen (example.com) zu achten, da dieser durch den neuen Befehl eventuell einen neuen Namen bekommen hat. Das kommt darauf an, welche Änderungen in der cli.ini vorgenommen wurden. Es ist immer das neueste Verzeichnis zu wählen, wenn es mehrere gibt. Das neue Script macht dies automatisch. Bei manuellem Import muss man selbst nachsehen, welches das neueste Verzeichnis ist.

CRON altes Script: Wird weiterhin das alte "letsencrypt-renew" Script als cronjob/crontab verwendet, so müssen gegebenenfalls die Pfade in dem Script angepasst werden. Das alte "letsencrypt-renew" Script ist unter folgendem Pfad zu finden. Bitte die 3(!) Pfade darin prüfen, ob sie noch existieren und auf die Verzeichnisse mit den neuesten Zertifikatsschlüsseln zeigen.
/home/user/bin/letsencrypt-renew
...
openssl x509 -checkend 864000 -in ~/.config/letsencrypt/live/example.com/cert.pem > /dev/null
...
uberspace-add-certificate -k ~/.config/letsencrypt/live/example.com/privkey.pem -c ~/.config/letsencrypt/live/example.com/cert.pem
...
CRON neues Script: Dieses neue Script kann auch zur Automatisierung für das regelmäßige erneuern eines Zertifikats (alle 90 Tage) als crontab angelegt werden.
@daily /usr/local/bin/uberspace-letsencrypt-renew
HINWEIS: Wenn das Script als cronjob/crontab angelegt wurde und das Script das von ihm neu erstellte Zertifikat nicht automatisch importieren sollte, dann springt das Script per cronjob/crontab bei @daily am nächsten Tag erneut an und generiert erneut ein neues Zertifikat. Bricht der automatische Import dann wieder ab, und wieder und wieder und wieder, also 5 Tage hintereinander, dann kann das Script wegen der Sperre von "5 Zertifikate in 7 Tagen" kein neues Zertifikat erstellen. Es besteht dann aber noch die Möglichkeit, das zuletzt generierte Zertifikat manuell zu importieren.

Mehr Details im Wiki von Uberspace.
---------------------

Ausführliches Tutorial zu Let's encrypt bei Uberspace

 Vorweg-Info für dieses Tutorial:
$user = durch deinen Usernamen ersetzen
example.com = durch deine Domain ersetzen
CN = Common Name = Zertifikats-Hauptdomain (neben den AN = Alternative Names = alias).


Keine Zeit? Am Ende gibt es eine längere Kurzform und eine ultimative Kurzform des Tutorials.

Der Befehl zum Starten von Let's encrypt für einen Uberspace muss nur ein einziges Mal ausgeführt werden. Danach nie wieder. Änderungen an Let's encrypt können editiert werden.

Es ist zu unterscheiden zwischen dem Programm "Let's encrypt" und den von diesem Programm erstellten "Let's encrypt Zertifikaten".

Beispiel:
[$user@uberspace ~]$ uberspace-letsencrypt
We have now created the following config file for you:
  /home/$user/.config/letsencrypt/cli.ini
Please review especially the domain list we have generated for you
and adapt the 'domains' setting if you want to make some changes:
  example.com
  www.example.com
  blog.example.com

When you're done you can use the official Let's Encrypt client by executing:
  letsencrypt certonly
You can safely ignore all 'Root (sudo) is required to run most of letsencrypt functionality' warnings.
[$user@uberspace ~]$ 

Für alle Änderungen kann diese Datei editiert werden:
/home/$user/.config/letsencrypt/cli.ini (bitte die Datei öffnen)
Zum Beispiel: Eine neue Domain/Subdomain in die Zeile "domains = " eintragen, austragen, oder die Zertifikats-Hauptdomain ändern.
(Die dort bereits eingetragenen Domains/Subdomains wurden von den im Uberspace geaddeten Domains/Subdomains übernommen. Die Liste der bei Uberspace geaddeten Domains/Subdomains können mit dem Befehl "uberspace-list-domains -w" eingesehen werden.)
Die erste Domain in der Zeile "domains = " in der cli.ini  ist die Zertifikats-Hauptdomain ("common name", CN).  Auf sie wird das Zertifikat ausgestellt. Das Zertifikat ist aber für alle weiteren in der Zeile aufgeführten Domains/Subdomains ("Alternative Name") gültig, nachdem der Befehl zum Erstellen des Zertifikats und der Befehl zum Zertifikats-Import ausgeführt wurden.

Letsencrypt-Zertifikats-Hauptdomain
Letsencrypt-Zertifikats-Hauptdomain
Der "common name" (CN) für das aktive Zertifikat kann auch per bash-Befehl in der SSH-Shell angezeigt werden:
[$user@uberspace ~]$ openssl s_client -showcerts -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -inform pem -noout -subject
Die Alias Namen (Alternative Name) können so ausgelesen werden:
[$user@uberspace ~]$ openssl s_client -showcerts -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -inform pem -noout -alias

WICHTIG: Die Befehle "uberspace-add-domain" und "uberspace-del-domain" ändern nicht die Domains/Subdomains in der Zertifikatsdatei cli.ini. Die cli.ini muss nach dem "add" oder "del" von Domains/Subdomains in Uberspace manuell editiert werden.

DNS: Für Domains/Subdomains, für die ein Zertifikat ausgestellt werden soll, oder die in ein Zertifikat aufgenommen werden, muss ein A und AAAA Record beim Domainhoster angegeben worden sein.

Nach Änderungen in der cli.ini in der Zeile "domains = " muss das Zertifikat erneuert werden, damit die Änderungen übernommen werden.

Alle Domains, für die ein Zertifikat gültig sein soll, auch Subdomains, müssen existieren, und es muss von außen auf sie zugegriffen werden können (existierende Website).

Beim Erneuern des Letsencrypt-Zertifikats werden die Änderungen, die in der cli.ini vorgenommen wurden (Eintrag einer neuen Domain/Subdomain / Löschung einer Domain/Subdomain / Setzen einer neuen Zertifikats-Hauptdomain) übernommen. Hier können Schwierigkeiten beim Importieren des neuen Zertifikats auftreten, wenn let's encrypt einen neuen Ordner in /home/$user/.config/letsencrypt/live und eine neue *.conf Datei in /home/$user/.config/letsencrypt/renewal angelegt hat.

Info: Der Kommandozeilen-Befehl "letsencrypt" hieß erst "certbot". Der Name "certbot" wurde wegen Rechtssteitigkeiten in "letsencrypt" geändert. Also die im Internet zu findende manpage für "certbot" gilt auch für "letsencrypt". Allerdings gilt nicht alles in der manpage für Uberspace, da Uberspace eine eigene Implementierung hat, wegen den nicht vorhandenen root-Rechten für seine User.

Der Befehl zum Erneuern des Zertifikats:
[$user@uberspace ~]$ letsencrypt certonly
ACHTUNG: Das Erstellen/Erneuern eines Zertifikats ist auf 5x in 7 Tagen beschränkt. Danach ist die "common name" Domain für 7 Tage gesperrt.

Bei dem Befehl "letsencrypt certonly" werden die Änderungen aus der cli.ini in die Zertifikats-Konfigurationsdatei aufgenommen.
/home/$user/.config/letsencrypt/renewal/example.com.conf
Zudem werden neue Schlüssel generiert.
Die neueren Schlüssel haben in der Regel im Dateinamen eine höhere Nummer. Sicherer ist es nach dem Datum zu gehen.

/home/$user/.config/letsencrypt/archive/example.com
Sep  7 22:02 cert1.pem
Sep  7 23:00 cert2.pem
Sep  7 23:04 cert3.pem
Sep  7 22:02 chain1.pem
Sep  7 23:00 chain2.pem
Sep  7 23:04 chain3.pem
Sep  7 22:04 full_cert1.pem
Sep  7 23:07 full_cert3.pem
Sep  7 22:02 fullchain1.pem
Sep  7 23:00 fullchain2.pem
Sep  7 23:04 fullchain3.pem
Sep  7 22:02 privkey1.pem
Sep  7 23:04 privkey3.pem

/home/$user/.config/letsencrypt/csr
Sep  7 22:02 0000_csr-letsencrypt.pem
Sep  7 23:00 0001_csr-letsencrypt.pem
Sep  7 23:04 0002_csr-letsencrypt.pem

/home/$user/.config/letsencrypt/keys
Sep  7 22:02 0000_key-letsencrypt.pem
Sep  7 23:00 0001_key-letsencrypt.pem
Sep  7 23:04 0002_key-letsencrypt.pem

(Die älteren Dateien können rein theoretisch gelöscht werden, wenn die neueren schon importiert wurden.)

Die Symlinks im folgenden Ordner ändern nur den Pfad der Verlinkung auf die neueren Dateien:
/home/$user/.config/letsencrypt/live/example.com (→../../archive/example.com)

Wenn mit dem Befehl "letsencrypt-renew" (Zertifikats-Erneuerungs-Script = Neues Zertifikat ausstellen (letsencrypt certonly) + importieren (uberspace-add-certificate)) ein neuer Ordner in /home/$user/.config/letsencrypt/live und eine neue *.conf Datei in /home/$user/.config/letsencrypt/renewal angelegt wurde, dann steht sich der Befehl selbst im Weg, weil er damit die Pfade zum Importieren der von ihm soeben neu angelegten Zertifikats-Dateien geändert hat und die Zertifikatsdateien zum Importieren nicht mehr findet, weil noch die alten in seinem Script stehen (/home/$user/bin/letsencrypt-renew). Das passiert unter anderem, wenn eine Alternative Name Domain aus der cli.ini entfernt wurde. Dazu weiter unten eine Lösung (alles löschen außer cli.ini und neu anlegen).

NICHT VERGESSEN:
Zum Schluß muss das erneuerte Zertifikat importiert werden:
[$user@uberspace ~]$ uberspace-add-certificate -k ~/.config/letsencrypt/live/example.com/privkey.pem -c ~/.config/letsencrypt/live/example.com/cert.pem
Hierbei ist zu beachten, dass die Ordner-Namen auch bei einer neuen Zertifikats-Hauptdomain, den alten Zertifikats-Hauptdomain-Namen beibehalten. Falls das nicht erwünscht ist, müssen vor dem Befehl "letsencrypt certonly" alle Unterordner im Ordner "/home/$user/.config/letsencrypt" gelöscht werden (nicht die Datei cli.ini). Sie werden dann mit dem Befehl "letsencrypt certonly" mit dem Namen der neuen Zertifikats-Hauptdomain neu angelegt.

Welches die aktuelle Zertifikats-Hauptdomain ist, kann mit "uberspace-list-certificates" nachgesehen werden:
[$user@uberspace ~]$ uberspace-list-certificates
common name: example.com
Mit dem Befehl "uberspace-list-certificates" ist auch am Zertifikats-Ablaufdatum zu sehen, wenn mehrere Zertifikate auf (veraltete) Zertifikats-Hauptdomains vorhanden sind.

Welche die aktuell gültige Zertifikats-Hauptdomain ist, ist auch in der Zeile "domains = " in der Datei /home/$user/.config/letsencrypt/renewal/example.com.conf nachzusehen. Die erste Domain/Subdomain in dieser Zeile ist die Zertifikats-Hauptdomain.
Welche die aktuell gültige Zertifikats-Hauptdomain sein sollte, ist in der Zeile "domains = " in der Datei cli.ini nachzusehen. Die erste Domain/Subdomain in dieser Zeile ist die gesetzte Zertifikats-Hauptdomain. Vorausgesetzt, die Änderungen in der cli.ini wurden bereits in das Letsencrypt-Zertifikat eingepflegt. Die erste Domain in der Zeile "domains = " in der Datei cli.ini sollte also mit dem "common name:" beim Befehl "uberspace-list-certificates" übereinstimmen, damit alles aktuell und korrekt ist.

Wenn eine neue Zertifikats-Hauptdomain (erste Domain in der Zeile "domains = " in der Datei cli.ini) für das Zertifikat eingerichtet wurde, kann anschließend das Zertifikat auf die alte Domain/Subdomain gelöscht werden.
Der Befehl zum Löschen/Entfernen alter Zertifikate:
[$user@uberspace ~]$ uberspace-del-certificate -c exampleold.com
Zu kompliziert und zu fehleranfällig ist, dass ein altes Zertifikat, dass durch eine neue Zertifikats-Hauptdomain erneuert wurde, wieder mit alter Zertifikats-Hauptdomain aktiviert werden kann.

Bei einem Austausch der Zertifikats-Hauptdomain können die Verzeichnisse, in denen die neuen Zertifikate liegen, ihre Namen ändern.
/home/$user/.config/letsencrypt/archive/example.com
/home/$user/.config/letsencrypt/live/example.com
Die Pfade im uberspace-"letsencrypt-renew"-Script müssen dann also editiert werden.
/home/$user/bin/letsencrypt-renew
Die Pfade müssen dort eventuell auch editiert werden, wenn vor dem Erstellen eines komplett neuen Zertifikats, oder wenn alle Unterordner im Ordner "/home/$user/.config/letsencrypt" gelöscht wurden, sowie eine neue Zertifikats-Hauptdomain gesetzt wurde, oder Alternative Name Domains entfernt wurden, und dies muss geschehen bevor das Letsencrypt-Zertifikat geupdatet wird (neues Zertifikat + Importieren), also der Befehl "letsencrypt certonly" mit neuer Zertifikats-Hauptdomain erfolgreich ausgeführt wurde. Weil dann wird die Letsencrypt-Zertifikats-Konfigurationsdatei beim Befehl "letsencrypt certonly" mit neuen Pfaden angelegt. Es kann auch sein, dass die Ordner mit Domain-Namen neu erstellt und eine Nummer angehängt bekommen ("example.com-001"; Das genaue Verhalten konnte nicht exakt nachvollzogen werden.). Dies ist zu kontrollieren und gegebenenfalls im "letsencrypt-renew"-Script anzupassen. Das letsencrypt-renew erstellt zwar mittels letsencrypt certonly unter Umständen neue Pfade, erneuert die Pfade zum Importieren des neuen Zertifikats aber nicht.
ZWISCHENINFO: Mit dem neuen Befehl/Script "uberspace-letsencrypt-renew" wurde diese Fehlerquelle beseitigt.
Die Pfade im "letsencrypt-renew"-Script müssen mit den Pfaden in folgender Datei übereinstimmen:
/home/$user/.config/letsencrypt/renewal/example.com.conf

Aber keine Panik. Falls der Cronjob beim Ausführen des "letsencrypt-renew"-Scripts einen Fehler entdeckt, so informiert Uberspace darüber in einer Email mit folgendem Betreff (evtl. im Spam-Ordner):
"Cron <$user@uberspace> ~/bin/letsencrypt-renew"


3x ZUSATZ-INFO:

1.) letsencrypt-renew Script

Zum Anlegen des "letsencrypt-renew"-Scripts muss die Anleitung im Wiki von Uberspace genauestens befolgt werden. Dabei ist zu beachten, dass zuerst diese Zeile IM GANZEN und OHNE Änderungen sowie ohne Zeilenumbruch auf einmal in die SSH-Kommandozeile eingegeben werden muss:
[$user@uberspace ~]$ domain=$(grep -e "[ \t]*domains.*" ~/.config/letsencrypt/cli.ini| sed "s/ //g" |cut -d "=" -f2 | cut -d "," -f1)
Die meisten werden einfach copy&paste verwenden, was an sich zu befürworten ist.
Beim "copy" darauf achten, dass nicht zuviel (Leerzeichen am Anfang oder Ende), oder zu wenig kopiert wurde, sowie kein Zeilenumbruch. Eventuell zur Kontrolle in einem Editor (zB notepadd++) zwischenspeichern.
Beim "paste" muss nur die rechte Maustaste einmal geklickt werden, danach Enter auf der Tastatur drücken.
HINWEIS: Bitte nicht von hier kopieren, da Zeilenumbrüche entstehen können, die das ganze Unternehmen zum scheitern bringen können.

Danach muss dieser Block IM GANZEN und auf einmal sowie OHNE Änderungen in die SSH-Kommandozeile eingegeben werden:
[$user@uberspace ~]$ cat > ${HOME}/bin/letsencrypt-renew <<__EOF__#!/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
# sleep for a random time so not all certificates get renewed at the same time
sleep $(expr $RANDOM % 600)
openssl x509 -checkend $(( 21 * 86400 )) -in ~/.config/letsencrypt/live/${domain}/cert.pem > /dev/null
if [ \$? != 0 ]; then
# run let's encrypt
letsencrypt certonly
# import certificate
uberspace-add-certificate -k ~/.config/letsencrypt/live/${domain}/privkey.pem -c ~/.config/letsencrypt/live/${domain}/cert.pem
fi
__EOF__
Für "copy&paste" gilt das Selbe wie es bei der ersten Zeile erwähnt wurde. Es dürfen keine zusätzlichen Zeilenumbrüche entstehen, deswegen:
HINWEIS: Bitte nicht von hier kopieren, da Zeilenumbrüche entstehen können, die das ganze Unternehmen zum scheitern bringen können.

Danach diese Zeile unverändert in die Kommandozeile einfügen:
chmod +x ${HOME}/bin/letsencrypt-renew
Das Einrichten eines Cronjobs muss danach erfolgen, wird aber hier nicht beschrieben. Dazu bitte den Anweisungen im Uberspace-Wiki folgen.


2.) Let's Encrypt certificate expiration notice (Ablaufdatum Hinweis-Emails)

Let's Encrypt sendet 19 Tage, 10 Tage und 1 Tag vor Ablauf des Zertifikats eine Email an den User (an die bei Uberspace aktive Email-Adresse). Diese bezieht sich auf das Ablaufdatum des erstellten Zertifikats.
Beim Erstellen eines Zertifikats erstellt Let's Encrypt einen separaten Datenbank-Eintrag auf den Servern von Let's Encrypt. In diesem Datenbank-Eintrag wird das Zertifikat mit den dazugehörigen Domains/Subdomains und dem Erstell-Datum sowie Ablauf-Datum eingetragen.
Bei einem reinen renew, bei dem keine Änderungen für das Zertifikat vorgenommen wurden, wird das Ablaufdatum im Datenbank-Eintrag aktualisiert.
Wenn Änderungen an den eingetragenen Domains/Subdomains vorgenommen wurden, so ist das für Let's Encrypt kein renew. Ob Änderungen vorgenommen wurden, prüft Let's Encrypt und handelt dementsprechend. Wenn Änderungen an den Zertifikats-Einstellungen vorliegen, dann wird kein reines renew vorgenommen, sondern ein neues Zertifikat erstellt, das einen neuen Datenbank-Eintrag bei Let's Encrypt bekommt. Allerdings bleibt der Datenbank-Eintrag für das vorherige Zertifikat bestehen. Jetzt passiert es, dass das Versenden der "expiration notice" auf das Ablaufdatum des vorherigen Zertifikats reagiert und abgesendet wird. Diese veralteten "expiration notice"-Emails können ignoriert, aber leider nicht abgeschalten werden. Für das neue Zertifikat werden unabhängig davon die "expiration notice"-Emails versendet, wenn das Ablaufdatum für dieses naht.


3.) .well-known Ordner

Der Ordner "/var/www/virtual/$user/html/.well-known" wird beim Erstellen/Importieren eines Let's encrypt Zertifikats benötigt. Er könnte nach dem Erstellen und Importieren des Zertifikats gelöscht werden, weil er bei jedem Erstellen/Updaten neu angelegt wird. Leider sieht das Script zum Erstellen das automatische Löschen nicht vor. Also kann der Ordner jedes mal gelöscht werden, oder einfach ignoriert werden.


WO SIND MEINE ZERTIFIKATE?

Genau genommen ist immer das aktuellste Zertifikat in dieser Datei (Symlink) verlinkt:
/home/$user/.config/letsencrypt/live/example.com/cert.pem
Nur liegt es da verschlüsselt vor. Also es mit einem Editor in SFTP ansehen bringt keine Informationen zu Tage.

Die von Let's encrypt generierten Zertifikate können auf der Webseite von Commodo Certificate Search eingesehen werden.

1.) Bitte auf den Link klicken und folgende Anweisungen befolgen, um ein Zertifikat anzeigen zu lassen:
https://crt.sh/?caid=16418

2. a) Im Dropdown-Menü "Select search type:" bitte "commonName (Subject)" auswählen.
2. b) In das Eingabefeld die Domain eintragen, die in der SSH-Shell bei diesem bash-Befehl unter "common name:" steht:
[$user@uberspace ~]$ letsencrypt-list-certificates
Bei Wildcard Domains muss der Stern * gegen Prozent % ausgetauscht werden. (% = wildcard).
2. c) Bei Bedarf können auch nur die nicht-abgelaufenen Zertifikate angezeigt werden, wenn ein Häkchen bei "Exclude expired certificates?" gesetzt wird.
Letsencrypt Zertifikate anzeigen
Letsencrypt Zertifikate anzeigen
3.) In der Spalte "Not After" ist das Ablaufdatum eines Zertifikates zu sehen. In der Spalte "Not Before" das Erstelldatum. Mit einem Klick auf "CN=example.com" wird das entsprechende Zertifikat geöffnet.
Letsencrypt Zertifikate anzeigen
Letsencrypt Zertifikate anzeigen
Es ist zu beachten, dass bei Let's encrypt sehr oft neue Zertifikate angelegt werden. Bei jedem bash-command "certonly" in der SSH-Shell wird ein neues Zertifikat angelegt. Mit dem "letsencrypt-renew" Script wird auch ein neues Zertifikat angelegt.

Anmerkung: Eine Zertifikatsdatei kann wie ein Papierzertifikat angesehen werden, das ein Nachweis für eine Berechtigung ist. Dieses Papierzertifikat hat eine bestimmte Gültigkeitsdauer. Ist das Papierzertifikat abgelaufen, so wird nicht das Ablaufdatum auf dem Papierzertifikat geändert, sondern ein neues Papierzertifikat mit neuem Ablaufdatum ausgestellt.

4.) Im Zertifikat ist der "common name:" und die "Alternative Name:" zu sehen, auf die das Zertifikat ausgestellt ist.

Letsencrypt Zertifikate anzeigen - common name
Letsencrypt Zertifikate anzeigen - common name

Letsencrypt Zertifikate anzeigen - Alternative name
Letsencrypt Zertifikate anzeigen - Alternative name
5.) Die Seriennummer eines Zertifikats bei crt.sh ermitteln:
Seriennummer eines Zertifikats checken
Seriennummer eines Zertifikats checken
Die Seriennummer wird für die nächste Aktion benötigt.

IST MEIN NEUESTES ZERTIFIKAT IMPORTIERT?

Bei Uberspace ist ein Zertfikat erst aktiv, wenn es importiert wurde. Welches Zertifikat aktuell importiert wurde kann über die Seriennummer (Serial Number) herausgefunden werden.

Mit dem folgenden bash-Befehl in der SSH-Shell (Kommandozeile) kann die Seriennummer des aktuellsten/neuesten Zertifikats und des importierten Zertifikats ausgelesen werden. Diese können unterschiedlich sein, wenn das aktuellste/neueste noch nicht importiert wurde. Der Unterschied ist an deren Seriennummer zu erkennen. Der folgende Befehl gibt die Seriennummer nach folgendem Muster aus:

< aktuellstes Zertifikat
---
> importiertes Zertifikat
[$user@uberspace ~]$ diff <(openssl x509 -in .config/letsencrypt/live/example.com/cert.pem -noout -serial) <(echo | openssl s_client -showcerts -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -inform pem -noout -serial) -s
Werden zwei unterschiedliche Seriennummern angezeigt, so wurde das aktuellste Zertifikat noch nicht importiert. Werden nach dem Importieren immer noch zwei unterschiedliche Seriennummern angezeigt, besteht ein größeres Problem.

Liefert der obige Befehl folgende Ausgabe, dann sind beide Seriennummern identisch. So soll es sein. Dann ist alles fein.
Files ... ... are identical
Hier die Befehle einzeln:

Die Seriennummer des neuesten Zertifikats kann mit folgendem Befehl ausgelesen werden:
[$user@uberspace ~]$ openssl x509 -in .config/letsencrypt/live/example.com/cert.pem -noout -serial
Die Seriennummer des aktiven Zertifikats kann mit folgendem Befehl ausgelesen werden:
[$user@uberspace ~]$ openssl s_client -showcerts -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -inform pem -noout -serial
Beachte: Ein Zertifikat ist erst ~5 Minuten nach Import aktiv.


TUTORIAL Kurzform
(letsencrypt editieren/updaten):


1.) Uberspace Domains checken (SSH)
[$user@uberspace ~]$ uberspace-list-domains -w
Es werden alle Domains/Subdomains angezeigt, die im Uberspace eingetragen wurden.
(evtl. neue/alte Domains/Subdomains eintragen/austragen). Die DNS A und AAAA Records beim Domainhoster nicht vergessen.

2.) Zertifikate checken (SSH)
[$user@uberspace ~]$ uberspace-list-certificates
Es werden alle vorhandenen Zertifikate mit der zugehörigen Zertifikats-Hauptdomain (common name:), sowie alle Domains/Subdomains (alternative name:), für die das Zertifikat gültig ist, angezeigt.

2.1.) Zertifikate Löschen/Entfernen (SSH)
[$user@uberspace ~]$ uberspace-del-certificate -c exampleold.com
Vor dem Erstellen/Importieren eines komplett neuen Zertifikats (nicht Update), die vorhandenen Zertifikate Löschen/Entfernen.

3.) Domains/Subdomains hinzufügen/entfernen (SFTP)

Alle Domains, für die ein Zertifikat gültig sein soll, auch Subdomains, müssen existieren, und es muss von außen auf sie zugegriffen werden können (existierende Website).

3.1.) Domains/Subdomains hinzufügen (SSH)

Das Hinzufügen einer neuen Domain/Subdomain kann über den command --expand erledigt werden.
Dabei muss die Zertifikats-Haupt-Domain (die bei "common name:" beim Befehl "letsencrypt-list-certificates" steht) angegeben werden, plus die neue Domain(s)/Subdomain(s).
Beispiel: Das Zertifikat ist auf "example.com" ausgesellt. Die Subdomain blog.example.com soll zu diesem Zertifikat hinzugefügt werden.
[$user@uberspace ~]$ letsencrypt certonly --expand -d example.com -d blog.example.com
Es kann dabei zu Problemen kommen, wenn ältere Zertifikate mit der selben Domain vorhanden sind. Für diesen Fall das weitere Vorgehen in diesem Tutorial benutzen.

Leider besteht (noch kein Befehl für das Entfernen von Domains/Subdomains in einem Zertifikat. Es ist ein --shrink in Diskussion, das eventuell in kommenden Versionen von Let's encrypt (evtl. 0.5) zur Verfügung steht.
Die installierte Let's encrypt Version ist mit "letsencrypt --version" in Erfahrung zu bringen.

3.2.) Domains/Subdomains hinzufügen/entfernen (SFTP)
Öffne:
/home/$user/.config/letsencrypt/cli.ini
Diese Zeile editieren:
domains =
(Auf die erste Domain/Subdomain wird das Zertifikat ausgestellt - Hauptdomain "common name", alle weiteren sind "Alternative name")

4.) Letsencrypt-Zertifikat updaten (SSH)

4.1.) Ganz sichere Methode (SSH)
Wer ganz sicher gehen will, dass er ein ganz neues Zertifikat erstellt, ohne das Altlasten gespeichert bleiben, der muss einfach alle Unterordner im Ordner "/home/$user/.config/letsencrypt" löschen (nicht die Datei cli.ini), bevor er den Befehl "letsencrypt certonly" ausführt.
Der bash-Befehl für die SSH-Shell Kommandozeile für das Löschen von mehreren Ordnern mit Unterordner und Dateien (hier bleibt die cli.ini erhalten):
ACHTUNG: Dieser Befehl löscht unwiderruflich!!! Achtung vor dem Zeilenumbruch!
[$user@uberspace ~]$ rm -rf /home/$user/.config/letsencrypt/{accounts,archive,csr,keys,live,renewal,renewal-hooks}
ACHTUNG: Dieser Befehl löscht unwiderruflich!!! Achtung vor dem Zeilenumbruch!

rm -rf /home/$user/.config/letsencrypt/{accounts,archive,csr,keys,live,renewal,renewal-hooks}

ACHTUNG: Dieser Befehl löscht unwiderruflich!!! Achtung vor dem Zeilenumbruch!

HINWEIS: Beim Setzen einer neuen Zertifikats-Haupt-Domain (common name) die Pfade im "letsencrypt-renew"-Script anpassen.

4.2.) Einfache Methode
[$user@uberspace ~]$ letsencrypt certonly
ACHTUNG: Das Erstellen/Erneuern eines Zertifikats ist auf 5x in 7 Tagen beschränkt.

Nach diesem Befehl müssen die Verzeichnisse kontrolliert werden. Wurde neben bestehenden Dateien/Ordner eine neue /renewal/xxx.conf Datei mit Nummerierung und/oder neue Verzeichnisse in /archive und /live mit Nummerierung (-0001) angelegt, dann wurde das Zertifikat nicht erneuert, sondern ein neues ausgestellt. Das ist suboptimal und passiert unter anderem beim Entfernen einer Alternative Name Domain/Subdomain in de cli.ini. Es müssen dann auf jeden Fall die Pfade im letsencrypt-renew Script angepasst werden, sowie die Pfade zum importieren des Zertifikats. Deshalb besser den Punkt 4.1. benutzen, um ganz sicher zu gehen.

INFO: Abgesehen davon ist es auch möglich für jede Domain ein eigenes Zertifikat anzulegen. Dazu bitte das Let's encrypt Support Forum kontaktieren. (Für jede weitere Domain eine eigene cli.ini. Beispiel: cli1.ini, cli2.ini, ...). Ob das bei Uberspace funktioniert, ist nicht bestätigt.

NICHT VERGESSEN:
5.) Letsencrypt-Zertifikat importieren (SSH)
[$user@uberspace ~]$ uberspace-add-certificate -k ~/.config/letsencrypt/live/example.com/privkey.pem -c ~/.config/letsencrypt/live/example.com/cert.pem
(Info: "example.com" durch schon vorhandenen Ordnernamen ersetzen.)
HINWEIS: Die Zeile bitte nicht von hier kopieren, da Zeilenumbrüche entstehen können.

ACHTUNG: Das Zertifikat ist erst nach ~5 Minuten aktiv!

Jetzt bitte 5 Minuten warten, danach zu Punkt 6.

6.) Abschlussbericht

Wer will kann zum Schluss die Lage mit folgendem (etwas längerem) Befehl checken:
[$user@uberspace ~]$ Domain=example.com; echo "### THE NEWEST CERT:"; openssl x509 -in ~/.config/letsencrypt/live/$Domain/cert.pem -noout -serial -dates; echo "common name (CN):"; cert-info --file ~/.config/letsencrypt/live/$Domain/cert.pem --cn; echo "Subject Alternative Name (SAN):"; cert-info --file ~/.config/letsencrypt/live/$Domain/cert.pem --alt; echo "++++++++++++"; echo "### THE IMPORTED CERT:"; openssl s_client -showcerts -servername $Domain -connect $Domain:443 2>/dev/null | openssl x509 -inform pem -noout -serial -dates; echo "common name (CN):"; cert-info --host $Domain --cn; echo "Subject Alternative Name (SAN):"; cert-info --host $Domain --alt


Hier die ultimative Kurzform: 

ACHTUNG: gegebenenfalls nur 5 x in 7 Tagen möglich.

1.) Domains/Subdomains in uberspace adden/deleten
uberspace-add-domain
uberspace-del-domain

2.) In der Datei /home/$user/.config/letsencrypt/cli.ini die Änderungen in der Zeile "domains:" eintragen.

3.) Per SSH in die Kommandozeile. 

4.) Alten Kram löschen 
(VORSICHT LÖSCHBEFEHL)
 rm -rf /home/$user/.config/letsencrypt/{accounts,archive,csr,keys,live,renewal,renewal-hooks}
(VORSICHT LÖSCHBEFEHL)

5.) CN von altem Zertifikat ermitteln
Zertifikat(e) auflisten:
uberspace-list-certificates
(den "common name: exampleold.com" merken)

6.) Altes Zertifikat löschen
 uberspace-del-certificate -c exampleold.com

7.) Neues Zertifikat ausstellen
letsencrypt certonly

8.) Neues Zertifikat importieren
uberspace-add-certificate -k ~/.config/letsencrypt/live/example.com/privkey.pem -c ~/.config/letsencrypt/live/example.com/cert.pem

8.1) Falls es eine Fehlermeldung gibt: " We can't import your certificate automatically." oder ähnlich, dann einfach nach ein paar Minuten (nur) den Import noch einmal probieren. Oder den dort aufgeführten Anweisungen folgen.

9.) Das neue Zertifikat ist nach ~5 Minuten aktiv.


INFO - Mai 2017 / Juli 2017 / ...
Uberspace teilt mit, dass es zurzeit Probleme mit dem Import der Zertifikate gibt (timeout).
Das Problem ist in der Status-Email vom Cron-Job zu erkennen. In der Cron-Job Status-Email sieht am Anfang alles gut aus, das neue Zertifikat wird erstellt, und am Ende steht dann dies:
--debug--
Loaded 1 certificates, 171 CAs and 0 CRLs

    Subject: CN=example.com
    Issuer: C=US,O=Let's Encrypt,CN=Let's Encrypt Authority X3
    Output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.

    Subject: CN=example.com
    Issuer: C=US,O=Let's Encrypt,CN=Let's Encrypt Authority X3
    Output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.

Chain verification output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.
--debug--
Das --debug-- bedeutet, dass das neu erstellte Zertifikat nicht importiert werden konnte.
Die User werden gebeten, die Zertifikate manuell zu importieren, immer wieder und wieder, bis es funktioniert.
Hier der Befehl zum Zertifikate-Import:
[$user@uberspace ~]$ uberspace-add-certificate -k ~/.config/letsencrypt/live/example.com/privkey.pem -c ~/.config/letsencrypt/live/example.com/cert.pem
Good byte!

Uberspace Email - Qmail - Vmail: Uberspace Email - Qmail - Vmail
Uberspace und Thunderbird: Uberspace Email-Accounts in Thunderbird einrichten
Check deine Uberspace Quota: Uberspace Quota Tutorial & Clearing

Ausschluss-Klausel: Keine Garantie. Keine Gewähr. Kein Support. Anfragen zwecklos.