Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Was fehlt?

Es liegt in der Natur der Sache: Ein Wiki ist niemals fertig. Wir geben uns große Mühe, mit der Entwicklung Schritt zu halten; lassen Supportanfragen direkt in neue Artikel einfließen … aber auch wir sind nicht perfekt. Wenn du hier nicht fündig wirst: Nicht schmollen - Bescheid sagen! Unter hallo@uberspace.de steht dir unser Team gerne bereit. Hand drauf!

webserver:https

Wir empfehlen dir ausdrücklich, von HTTPS Gebrauch zu machen. Insbesondere, wenn du „administrative“ Tätigkeiten durchführst, z.B. das Konfigurationsinterface deines Shops oder deines Blogs aufrufst, sollte das grundsätzlich nur per HTTPS geschehen, da hierbei sensible Daten durchs Internet übertragen werden. Mit der breiten Verfügbarkeit von Let's Encrypt gibt es keine Ausrede mehr, deine Webseiten unverschlüsselt verfügbar zu machen.

Wenn auch du das für eine gute Idee hältst und deinen Besuchern die Entscheidung abnehmen möchtest, ob sie HTTP oder HTTPS nutzen sollen: Wie du HTTPS erzwingen und andere sicherheitsrelevante Header setzen kannst, beschreiben wir im Artikel Webserver security.

unsere TLS-Zertifikate

Wir setzen auf unseren Hosting-Servern Wildcard-TLS-Zertifikate ein, die auf den Namen *.servername.uberspace.de ausgestellt sind. Liegt dein Uberspace wiebke also auf unserem Server amnesia, so wird dein Uberspace über unser Zertifikat für *.amnesia.uberspace.de mit abgedeckt - im Klartext heißt das, dass dein Uberspace dann unter der Adresse https://wiebke.amnesia.uberspace.de/ ohne Warnmeldung in allen gängigen Browsern abrufbar ist.

eigene TLS-Zertifikate

Du hast eigene Domains aufgeschaltet und passende TLS-Zertifikate? Sehr gut! Du kannst diese problemlos mit deinem Uberspace nutzen. In der Anzahl der Zertifikate bist du nicht beschränkt, du kannst so viele Zertifikate importieren, wie du brauchst. Hier erfährst du, wie du deine Zertifikate importieren kannst.

Wenn du noch keine eigenen Zertifikate hast, wie wäre es denn mit kostenlosen von Let's Encrypt?

Let's-Encrypt-Zertifikate

Let's Encrypt ist eine Initiative, die kostenlos und automatisiert Zertifikate ausstellt, die z.B. für HTTPS nutzbar sind.

Wir machen es dir so einfach wie möglich: Mit dem Befehl uberspace-letsencrypt kannst du dir eine Konfiguration mit all deinen aufgeschalteten Domains anlegen, die die Nutzung des offiziellen letsencrypt-Kommandozeilenclients ohne Root-Rechte ermöglicht:

[julia@amnesia ~]$ uberspace-letsencrypt 

We have now created the following config file for you:

  /home/julia/.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:

  www.domain1.tld
  domain1.tld
  domain2.tld

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.

Anschließend kannst du mit dem Befehl letsencrypt certonly automatisch Keys generieren und Zertifikate ausstellen lassen. Wichtig ist, dass die DNS-Records stimmen und alle Domains auch auf deinen Uberspace zeigen:

[julia@amnesia ~]$ letsencrypt certonly
[...]
IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through e-mails sent to julia@amnesia.uberspace.de.
 - Congratulations! Your certificate and chain have been saved at /home/julia/.config/letsencrypt/live/www.domain1.tld/fullchain.pem.
   Your cert will expire on 2016-03-03. To obtain a new version of the certificate in the future, simply run Let's Encrypt again.
 - Your account credentials have been saved in your Let's Encrypt configuration directory at /home/julia/.config/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Let's Encrypt so making regular backups of this folder is ideal.

Et voilà: Dein Zertifikat wurde erstellt und mit dem passenden Key unter /home/julia/.config/letsencrypt/live/www.domain1.tld/ abgelegt:

[julia@amnesia ~]$ ls -la /home/julia/.config/letsencrypt/live/www.domain1.tld/
total 8
drwxr-xr-x 2 julia julia 4096 Feb  3 15:47 .
drwx------ 3 julia julia 4096 Feb  3 15:47 ..
lrwxrwxrwx 1 julia julia   37 Feb  3 15:47 cert.pem -> ../../archive/www.domain1.tld/cert1.pem
lrwxrwxrwx 1 julia julia   38 Feb  3 15:47 chain.pem -> ../../archive/www.domain1.tld/chain1.pem
lrwxrwxrwx 1 julia julia   42 Feb  3 15:47 fullchain.pem -> ../../archive/www.domain1.tld/fullchain1.pem
lrwxrwxrwx 1 julia julia   40 Feb  3 15:47 privkey.pem -> ../../archive/www.domain1.tld/privkey1.pem
Bis jetzt hast du das Zertifikat nur erstellt, nicht aber eingebunden! Damit das Zertifikat auch tatsächlich vom Webserver verwendet wird, lies dir noch den Punkt Importieren weiter unten durch.

Übrigens ist dieses Zertifikat für alle oben angegebenen Domains gültig, du bekommst also nicht ein Zertifikat pro Domain, sondern ein Zertifikat, welches für alle Domains gültig ist:

[julia@amnesia ~]$ cert-info --file /home/julia/.config/letsencrypt/live/www.domain1.tld/fullchain.pem --alt
www.domain1.tld
domain1.tld
domain2.tld
Let's Encrypt selbst wird 15 Tage vor Ablauf eines Zertifikates beginnen, Dich via Mail mehrfach zu warnen, dass Dein erstelltes Zertifikat bald abläuft. Das passiert unabhängig davon, ob Du bereits ein neues erstellt und hinterlegt hast. Entsprechende Mails von expiry@letsencrypt.org sind also kein Anlass zur Sorge, wenn uberspace-list-certificates bereits ein späteres Ablaufdatum für des Zertifikat anzeigt.

Importieren

Deine Zertifikate - ob nun von Let's Encrypt oder einem anderen Anbieter - kannst du mit uberspace-add-certificate importieren. Sollte es sich um ein Zertifikat eines externen Anbieters handeln, lade sowohl den privaten Schlüssel als auch das zugehörige TLS-Zertifikat per SSH/SFTP auf deinen Uberspace hoch, und zwar direkt in dein Home-Verzeichnis ~/ oder einem dort für die Dateien extra angelegten Unterverzeichnis. Lade die Dateien keinesfalls in deinen DocumentRoot /var/www/virtual/$USER hoch, da sie dort potentiell von jedem mitgelesen werden könnten und damit wertlos wären. Im Fall von Let's Encrypt befinden sich die notwendigen Dateien natürlich schon auf deinem Uberspace.

Unser Script überprüft das Zertifikat und importiert - wenn alles klappt - das Zertifikat in unsere HTTPS-Frontend-Konfiguration. Mit dem Schalter –help gibt uberspace-add-certificate darüber Auskunft wie es benutzt werden möchte:

[wiebke@amnesia ~]$ uberspace-add-certificate --help
Usage: uberspace-add-certificate [options]

This shell script adds a TLS certificate to the webserver configuration.

Go to https://wiki.uberspace.de/webserver:https for more info.

Options:
 
  --help                    This help message.

  -k <key file>             🔑  Key file for the certificate.
                            Will be decrypted if encrypted.

  -c <certificate file>     📝  Certificate file. 

Also bei Zertifikaten von Let's Encrypt z.B. so:

[julia@amnesia ~]$ uberspace-add-certificate -k ~/.config/letsencrypt/live/www.domain1.tld/privkey.pem -c ~/.config/letsencrypt/live/www.domain1.tld/cert.pem
🔑  Found key... 
📝  Found certificate...
🔑  Key seems valid, moving on...
📝  Certificate seems valid, moving on... (step by step)
🔐  Certificate matches key, moving on... (we're getting there!)
📜  Magically getting intermediate certificate(s) if there are any needed... (hold on tight)
🔐  Checking for www.domain1.tld.
🌍  temporary webserver started...
✅  certificate is valid.
🌍  killed temporary webserver...
🚀  All good! Your new certificate will be live within the next five minutes.

Wenn die Ausgabe so aussieht: Bestens. Du brauchst dich um nichts weiter zu kümmern. Wenn das Zertifikat nicht importiert werden konnte, gibt dir das Skript Informationen aus, mit denen du dich per Mail an uns wenden kannst. Wir importieren nur Zertifikate, die gegen das ''ca-bundle'' von CentOS validieren.

Automatisieren von Let's Encrypt

Da dieses Zertifikat spätestens alle 90 Tage erneuert werden muss, bietet es sich an, diesen Vorgang zu automatisieren. Und da du den Terms of Service bereits zugestimmt hast, kannst du deine cli.ini so anpassen, dass du nicht mehr danach gefragt wirst:

[julia@amnesia ~]$ cat >> ${HOME}/.config/letsencrypt/cli.ini <<__EOF__

# To prevent being forced to agree manually to the terms
agree-tos = True

__EOF__

Das ist wichtig, damit du beim nächsten Mal nicht mehr mit dem Skript interagieren musst, sondern es einfach so durchläuft. Ggf. musst du noch renew-by-default = True eintragen, wenn du uberspace-letsencrypt nach dem 02.02.2016 ausgeführt hast, haben wir das bereits für dich erledigt.

Als nächstes kannst du dir ein Skript basteln, welches du dann im nächsten Schritt täglich von einem Cronjob aufrufen lassen kannst. Da die Pfade der Zertifikate von der ersten Domain abhängen, die darüber abgedeckt sind, schreiben wir uns das im Beispiel bequem in eine Variable:

[julia@amnesia ~]$ domain=$(grep -e "[ \t]*domains.*" ~/.config/letsencrypt/cli.ini| sed "s/ //g" |cut -d "=" -f2 | cut -d "," -f1)

Das Skript kann dann z.B. so aussehen:

[julia@amnesia ~]$ 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__

Das obige Beispiel überprüft, ob das Zertifikat noch länger als 21 Tage gültig, fragt ggf. ein neues an und importiert dies dann automatisch. Hier haben bereits viele unserer User eigene Skripte geschrieben, unser Ansatz orientiert sich an letsencrypt-renew von nerdoc. Vielen Dank an dieser Stelle!

Es gibt hier viele Variablen (z.B. ${domain}), die beim Befüllen per cat aufgelöst werden. Es hilft also nicht weiter, die Zeilen 1:1 in eine Datei zu kopieren. Der Vorgang muss per cat erledigt werden, sonst klappt's nicht!

Natürlich muss das ganze auch ausführbar sein:

[julia@amnesia ~]$ chmod +x ${HOME}/bin/letsencrypt-renew

Du hast nun also ein Skript, welches du z.B. täglich ausführen kannst und welches bei Bedarf die Zertifikate erneuert und importiert. Ein Eintrag für deine Crontab sähe z.B. so aus:

@daily ~/bin/letsencrypt-renew

Anzeigen

Um dir anzeigen zu lassen, welche Zertifikate aktuell für deinen Uberspace aktiv sind, kannst du uberspace-list-certificates nutzen. Das Skript zeigt dir auch an, für welche Domains die Zertifikate noch gültig sind (also die alternative names), wann es abläuft und wann es entfernt wird. Das kann dann z.B. so aussehen:

[wiebke@amnesia ~]$ uberspace-list-certificates 
common name: wiebke.org
issuer: Let's Encrypt Authority X1
valid until: 2016-04-24 15:18:00 CEST
will be removed in 85 days.
alternative name: www.wiebke.org
alternative name: blog.wiebke.org

Das Zertifikat ist also nicht nur für wiebke.org, sondern auch für www.wiebke.org und blog.wiebke.org gültig.

Entfernen

Wir entfernen Zertifikate, die nicht mehr gültig sind, automatisch und schicken dir eine Mail an deine primäre E-Mail-Adresse. Solltest du ein Zertifikat selbst vor Ablauf der Gültigkeitszeit entfernen wollen, so ist auch das kein Problem. uberspace-del-certificate ist dein Freund und Helfer und auch dieses Skript gibt mit –help Auskunft über die Bedienung:

[wiebke@amnesia ~]$ uberspace-del-certificate --help
Usage: uberspace-del-certificate [options]

This shell script removes a certificate with a given common name
from the configuration. 

Go to https://wiki.uberspace.de/webserver:https for more info.

Options:
 
  --help            This help message.

  -c <common name>  📝  common name of the certificate to remove.

List existing certificates with 

  $ uberspace-list-certificates

Möchtest du also das Zertifikat, welches für wiebke.org ausgestellt wurde, entfernen, so ginge das folgendermaßen:

 
[wiebke@amnesia ~]$ uberspace-del-certificate -c wiebke.org
📝  removing certificate for wiebke.org...
The webserver's configuration is adapted; it will get active within at most 5 minutes.
Wildcard Zertifikate kannst du mit uberspace-del-certificate -c wildcard.domain.tld entfernen.

Technische Hintergründe

  • Unsere Software unterstützt keine ECDSA-Zertifikate.
  • DSA-Zertifkate werden zwar unterstützt, gelten aber derzeit wegen der Limitierung auf 1024 Bit Schlüssellänge als unsicher, wir raten davon ab.
  • Bei RSA-Zertifikaten empfehlen wir Schlüssellängen von mindestens 2048 Bit oder höher. (Wir selbst stellen schon auf 4096 Bit um.)
  • Um die Zwischenzertifikate kümmern wir uns.
  • Privater Schlüssel und das Zertifikat müssen im PEM-Format vorliegen. (Wenn du dir hier nicht sicher bist, liegen deine Daten vermutlich im PEM-Format vor ☺️)
  • In diesem Blogpost zum Zertifikatsimport gehen wir genauer auf das wieso, weshalb, warum ein und erläutern, wie wir den Zertifikatsimport technisch realisiert haben.
  • In unserem Blogpost zu Let's Encrypt findest du mehr Informationen und Hintergründe zu uberspace-letsencrypt und letsencrypt certonly.
  • Let's Encrypt überprüft die Gültigkeit von Top-Level-Domains an Hand der Public Suffix List. Wir sind da etwas weniger streng und erlauben beispielsweise die TLDs der OpenNIC Initiative, .onion und noch einige mehr. Diese kannst du nicht mit Let's Encrypt verwenden.
  • In der Vergangenheit haben wir auch Zertifikate importiert, die nicht gegen das ca-bundle von CentOS validieren, z.B. von CAcert oder selbst signierte Zertifikate. Mit dem Start von Let's Encrypt sind valide Zertifikate für jeden kostenlos verfügbar geworden, sodass wir keinen Grund mehr sehen, an dieser Praxis fest zu halten.
webserver/https.txt · Zuletzt geändert: 2017/01/17 07:45 von uber