Funkenstrahlen Podcasting, Netzpolitik, App-Entwicklung

TLS angeknipst

Ich habe schon viele Geschichten über die Einrichtung von HTTPS gehört: “Das ist sündhaft teuer!” oder “Das ist ziemlich komplex und schwierig einzurichten!”

Das Problem: Ganz Unrecht haben sie nicht. Das Ergebnis: Viele Webseiten sind nur via HTTP erreichbar. Von Webseiten, die in irgendeiner Form einen Login bieten, möchte ich gar nicht sprechen - hier ist fehlendes TLS unentschuldbar. Dennoch ist es auch für Webseiten, die nur Content anbieten sinnvoll alle Verbindungen über TLS abzuwickeln. So lassen sich übermittelte Daten vor den Augen Dritter schützen: Sowohl vor Schnüffelei als auch vor Manipulation.

Horrorstories hin oder her - ich habe mich vor ein paar Tagen entschlossen für dieses Blog TLS anzuknipsen.

Der erste Schritt ist die Suche nach einer Certificate Authority, kurz CA. Hier kann ich mir ein Zertifikat ausstellen lassen, das für TLS benötigt wird. Preislich gibt es da noch oben kaum Grenzen. Vor allem Wildcard-Zertifikate können richtig teuer werden (Ein Wildcard-Zertifikat gilt auch für alle Subdomains). Als Vertreter der kostenlosen Angebote sind vor allem CAcert und StartSSL bekannt. Entschieden habe ich mich letztendlich für StartSSL, da CAcert kein Root-Zertifikat in den Browsern hat. Das ist wichtig, da der Besucher meiner Domains sonst eine Warnung angezeigt bekommt, dass das Zertifikat der Domain nicht von einer anerkannten Root-CA unterschrieben wurde. Eine solche Warnung ist verheerend, denn viele Nutzer können eine solche Meldunge nicht richtig interpretieren und machen die Seite dann vorsichtshalber zu.

Um alles einzurichten habe ich mich am Wikieintrag von Uberspace und an dieser netten Anleitung orientiert.

Zunächst einmal habe ich mich durch den Prozess bei StartSSL gekämpft. Angesichts der komplett antik wirkenden Webseite war das gar nicht so einfach.

Es folgten einige Bestätigungsmails, bis ich schließlich mein erstes Zertifikat ausstellen konnte. Dazu erzeugt man sich den PrivateKey am besten selbst auf dem Server und lässt das nicht StartSSL machen. Niemand sollte euren PrivateKey haben, auch nicht StartSSL.

# PrivateKey generieren
openssl genrsa 4096 > ssl.key
# Daraus Certificate Request generieren
openssl req -new -key ssl.key -out csr.pem

Den Certificate Request csr.pem kann man dann bei StartSSL hochladen und bekommt dann das Zertifikat ausgestellt. Das legt man dann auf dem eigenen Server an die richtige Stelle (bei Uberspace läuft das via Support).

HTTPS only und HSTS

Fehlt nur noch das Umleiten aller Nutzer auf die HTTPS Seite. Das geschieht am besten über .htaccess

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{ENV:HTTPS} !=on
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=307,L]
Header set Strict-Transport-Security "max-age=31536000" env=HTTPS

Die letzte Zeile sorgt außerdem dafür, dass bestimmte Angriffe verhindert werden, indem Strict-Transport-Security aktiviert wird.

Um das eigene HTTPS-Setup zu testen eignet sich am besten der Online-Test von Qualys.

Tipp: Wenn ihr mehrere Subdomains habt, dann könnt ihr entweder ein Class 2 Zertifikat nutzen (das aber Geld kostet) oder mehrere Zertifikate nutzen: Ein Zertifikat pro Subdomain. Dazu einfach die Zertifikaterstellung für jede Subdomain wiederholen.

Ein ganz schön holpriger Weg. Insgesamt hat es 6 Stunden gedauert: Probleme mit der StartSSL Webseite im Browser, lange Wartezeiten auf Bestätigungsmails (in der Zeit habe ich natürlich etwas anderes gemacht) und häufig Unklarheit was denn der nächste Schritt sein soll. Ich bin jetzt froh, dass ich nicht noch mit technischen Schwierigkeiten kämpfen musste.

Dieser ganze Prozess muss dringend deutlich einfacher und billiger werden! Let’s Encrypt schickt sich an genau das zu schaffen:

The Let’s Encrypt management software will:

Automatically prove to the Let’s Encrypt CA that you control the website.
Obtain a browser-trusted certificate and set it up on your web server.
Keep track of when your certificate is going to expire, and automatically renew it.
Help you revoke the certificate if that ever becomes necessary.

Die Einrichtung wird dabei ein Kinderspiel:

$ sudo apt-get install lets-encrypt
$ lets-encrypt example.com

Hoffen wir, dass bis dahin auch OpenSSL wieder in einem halbwegs brauchbaren Zustand ist…

Update

Let’s Encrypt ist nun für jedermann nutzbar.