Du bist hier:Start»Wissen»Webseite»Verschlüsselung

Verschlüsselung mit Let's Encrypt

31.03.2018

Symbol für Verschlüsselung

Im März 2018 habe ich meine Webseite auf Verschlüsselung mit HTTPS umgestellt (HyperText Transfer Protocol Secure). Wer http:// in der Adresszeile des Browsers für meine Internetseite eingibt, wird jetzt automatisch auf die verschlüsselte Verbindung mit https:// weitergeleitet. Wenn du auf meine Webseite oder einen Artikel verlinken möchtest, solltest du ab jetzt bitte https://www.torsten-traenkner.de am Anfang des Links verwenden. Falls du eine Webseite betreibst und ebenfalls über einen Umstieg auf Verschlüsselung nachdenkst, dann gibt es in diesem Artikel einige Hinweise und Anleitungen für den Umstieg.

Für die Verschlüsselung des Datenverkehrs zwischen Webbrowser und Webserver werden normalerweise teure Zertifikate benötigt. Seit Ende 2015 gibt es mit Let's Encrypt ein Projekt, das kostenlose Zertifikate vergibt. Während des Zertifizierungsprozesses muss lediglich nachgewiesen werden, dass man Zugriff auf den Webserver hat und dort zum Beispiel Dateien speichern darf. Ein kleiner Nachteil dieses vereinfachten Zertifizierungsprozesses ist, dass unklar bleibt, welche Person oder welches Unternehmen das Zertifikat beantragt hat und wer hinter einer Webseite steckt. Trotzdem ist es aus meiner Sicht sinnvoll den Datenverkehr überhaupt erst einmal zu verschlüsseln, so dass der Datenverkehr nicht so leicht abgehört oder manipuliert werden kann. Außerdem bewertet die Suchmaschine Google eine Webseite mit HTTPS in seinen Trefferlisten etwas besser - als Anreiz zum Umstieg. Eine verschlüsselte Verbindung wird im Webbrowser Firefox links neben der Adressleiste mit einem grünen Schloss symbolisiert.

grünes Schloss als Symbol für Verschlüsselung

grünes Schloss als Symbol für Verschlüsselung

Webhoster Goneo

Der Webhoster Goneo bietet für 3 Euro im Monat beziehungsweise 36 Euro im Jahr 20 GB Speicherplatz (Webspace) inklusive eines Let's Encrypt SSL-Zertifikats (Stand: März 2018). Da ich vorher das Paket "Homepage Easy" bei Goneo für 24 Euro im Jahr hatte, habe ich nicht lange überlegt und habe ein Upgrade auf das Paket "Webhosting Start" durchgeführt. Im Wiki von Goneo https://wiki.goneo.de/lets_encrypt ist beschrieben, wie SSL eingeschaltet werden kann. Einfach ein Häkchen setzen - und das war's. Nach spätestens 15 Minuten ist die Verschlüsselung aktiviert. Die automatische "Web-Weiterleitung" von http auf https nach der Anleitung von Goneo hat bei mir mit Stand vom März 2018 nicht richtig funktioniert. Deshalb ist mein Rat diese Weiterleitung nicht einzuschalten und stattdessen die unten beschriebene Datei .htaccess zu benutzen. Die "Konfiguration der Webserver Einstellungen" müßte jetzt so aussehen:

Einstellungen bei Goneo für SSL

Einstellungen bei Goneo für SSL (zum Vergrößern klicken)

Leider bietet Goneo bei "Webhosting Start" nur ein kostenloses SSL-Zertifikat an. Dieses eine Zertifikat würde eigentlich reichen, wenn Goneo im "Subject Alternative Name" (SAN) auch die Subdomain www oder eine Wildcard eintragen würde. Also für example.com und www.example.com oder zum Beispiel mit Wildcard *.example.com.

Beispiel für ein Zertifikat mit Alternativ-Name für mehrere Subdomains

Beispiel für ein Zertifikat mit Alternativ-Name für mehrere Subdomains

Da Goneo nur einen Namen anbietet, habe ich mich für das Zertifikat mit www also zum Beispiel "https://www.example.com" entschieden. Die URL "https://example.com" ohne "www" führt mit Stand März 2018 leider auf eine Fehlerseite von Goneo. Als Alternative für die Web-Weiterleitung von Goneo habe ich in die Datei .htaccess im Root-Ordner - also bei Goneo .../htdocs/.htaccess - folgende Zeilen eingetragen:

ErrorDocument 404 https://www.example.com

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !^/exception
RewriteCond %{HTTPS} !=On [NC,OR]
RewriteCond %{HTTP_HOST} !=www.example.com [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Statt www.example.com muss natürlich der entsprechene Website-Name eingetragen werden. Die erste Zeile mit Fehlercode 404 leitet alle Anfragen für nicht-verfügbare Seiten auf die Startseite um. Die anderen Zeilen sorgen dafür, dass Anfragen für HTTP-Seiten auf HTTPS-Seiten weitergeleitet werden. Die Zeile mit "REQUEST_URI /exception" definiert eine Ausnahme für die Weiterleitung auf HTTPS. Dies kann zum Beispiel für veraltete Programme notwendig sein, die noch nicht SSL beherrschen, aber unverschlüsselt auf das Unterverzeichnis "exception" zugreifen müssen. Die Bedingungen zum Ändern der URL (RewriteCond) werden je Zeile mit "und" verknüpft. Wenn [OR] in eckigen Klammern dahinter steht, dann werden die Bedingungen "oder"-verknüpft. [NC] bedeutet, dass Großbuchstaben in der URL ignoriert werden (no case). R=301 ist eine Umleitung (redirect) mit dem HTTP-Statuscode 301. L bedeutet, dass es sich um die letzte Regel zum Ändern der URL handelt. Weitere Rewrite-Flags sind hier erklärt.

Außerdem wollte ich in die Datei .htaccess zusätzlich die folgende Zeile für HTTP Strict Transport Security (HSTS) eintragen.

Header set Strict-Transport-Security "max-age=86400" env=HTTPS

Allerdings wird diese Zeile von Goneo überschrieben, so dass es nichts bringt diese Zeile in .htaccess einzutragen. Stattdessen kann HSTS über das Kundencenter von Goneo eingestellt werden. Kundencenter - Experten Funktionen - HSTS Verwaltung - HSTS Max Age - 1 Tag. Was hat es mit Strict Transport Security (HSTS) auf sich?

HTTP Strict Transport Security (HSTS)

Die Verschlüsselung mit HTTPS soll Man-In-The-Middle Angriffe erschweren. Problematisch ist jedoch der Anfang einer HTTPS-Verbindung. Woher soll der Webbrowser wissen, ob eine Webseite statt HTTP zusätzlich auch HTTPS anbietet? Der Webserver muss dem Browser mitteilen: "Hallo Browser ! Ich kann auch HTTPS.". An diesem Punkt könnte bereits ein Man-In-The-Middle Angriff passieren wie das folgende Bild darstellen soll.

Man-In-The-Middle Angriff beim Wechsel von HTTP zu HTTPS

Man-In-The-Middle Angriff beim Wechsel von HTTP zu HTTPS

In Szenario 1 beantwortet ein Man-In-The-Middle die HTTP-Anfrage mit einer gefälschten Webseite. In Szenario 2 kommt die HTTP-Anfrage zum eigentlichen Webserver durch. Der Webserver antwortet, dass er auch HTTPS-Verschlüsselung kann. Daraufhin benutzt der Webbrowser HTTPS und der Webserver teilt mit, dass der Webbrowser HTTPS für das nächste Jahr für diese Webseite benutzen kann. In Szenario 3 wird der Webserver nach einer Woche wieder besucht und der Webbrowser hat sich gemerkt, dass er den Webserver per HTTPS erreichen kann und stellt gleich die erste Anfrage über HTTPS, so dass ein Man-In-The-Middle keine Chance hat. Ein Nachteil der Methode ist, dass bei Zertifikat-Problemen kein Rückfall auf HTTP möglich ist.

Leider gibt es dabei einige Probleme. Wenn example.com aufgerufen wird und die Verschlüsselung nur für www.example.com eingerichtet ist, dann wird bei example.com trotzdem erst http://example.com mit anschließender Umleitung auf https://www.example.com aufgerufen. Nur wenn www.example.com in den Webbrowser eingegeben wird, dann wird sofort https://www.example.com aufgerufen.

Im Webbrowser Firefox wird die Liste der Webseiten mit HSTS in der Datei SiteSecurityServiceState.txt mit den entsprechenden Zeiten der Gültigkeit im Profil-Verzeichnis von Firefox gespeichert. Unter Linux wäre HSTS in der Datei:

cat ~/.mozilla/firefox/*.default/SiteSecurityServiceState.txt

Die Datei für HSTS kann in Firefox über das Menü - "Chronik" - "Neueste Chronik löschen" - "Website-Einstellungen" gelöscht werden. Im Zweifelsfall kann die Datei auch von Hand gelöscht werden. Wer den Browserverlauf löschen möchte, muss eigentlich auch diese Datei mit entfernen - auch wenn die Datei bei der Verschlüsselung helfen soll.

Wer sich als Webmaster nicht sicher ist, ob mit der Verschlüsselung der Webseite in Zukunft alles problemlos funktioniert, kann den Wert "max-age" für HSTS auf einen kleinen Wert setzen. Der Webbrowser vergißt dann nach der Zeit max-age, dass die Webseite nur per HTTPS erreichbar ist.

Ein kleiner Nachteil bei Goneo ist, dass im Paket "Webhosting Start" kein SSH-Zugang für das verschlüsselte Hochladen der Dateien auf den Webserver angeboten wird. Es bleibt nur das Hochladen über das ungesicherte File Transfer Protocol (FTP) oder per verschlüsseltem Website-Upload, das ich weiter unten beschreibe.

Webhoster Host Europe

Seit einigen Jahren betreue ich auch eine Webseite bei Host Europe. Host Europe bietet 35 GB Speicherplatz in seinem kleinsten Paket "WebHosting Basic" für 4 Euro im Monat beziehungsweise 48 Euro im Jahr (Stand März 2018). Hinzu kommen noch 12 Euro für die Domain-Registrierung. Da ist Goneo deutlich günstiger und bietet seinen KundInnen SSL per Häkchen an. Im Augenblick bietet Host Europe keinen Automatismus, um SSL zu aktivieren. Immerhin gibt es die Möglichkeit eigene SSL-Zertifikate bei Host Europe hochzuladen. Dazu muss man sich zunächst Zertifikate von Let's Encrypt besorgen. Während des Zertifizierungsprozesses müssen auf dem Webserver Dateien als "Challenge" hochgeladen werden, um nachzuweisen, dass das Zertifikat zum Webserver passt.

Zertifizierungsprozess von Let's Encrypt

Zertifizierungsprozess von Let's Encrypt

Das im oberen Bild verwendete Logo stammt von der Internet Security Research Group (ISRG) und ist unter der Creativecommons Lizenz CC BY-NC 4.0 lizensiert.

Werden mehrere Domains in einer Zertifikatsanfrage gesendet, dann muss für jede Domain eine Challenge-Datei auf den Webserver hochgeladen werden. Wildcard-Zertifikate funktionieren im Augenblick (März 2018) nur über DNS. Außerdem soll eine Email-Adresse als Kontakt angegeben werden.

Wer unter Windows unterwegs ist, wird vermutlich mit der Anleitung von Günter Born weiterkommen. Unter Linux kann das Zertifikat über den Certbot beziehungsweise das Programm letsencrypt-auto angefragt werden.

# get the necessary software
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt

# become root
sudo bash

# get certificates for example.com
#  "expand" is only necessary if you already have a certificate for example.com
./letsencrypt-auto certonly -a manual --rsa-key-size 4096 \
  --expand -d example.com,www.example.com

# during the process create the required files in another terminal
mkdir -p .well-known/acme-challenge/
cd .well-known/acme-challenge/

# just an example:
echo Ch4llenge.foobar > Ch4llenge

# upload the directories and file

# this needs to be done for each domain in the certificate

# afterwards the certificates are stored here:
cd /etc/letsencrypt/live/www.example.com/

# or

cd /etc/letsencrypt/live/example.com/

# important files:
cat README
privkey.pem : the private key for your certificate.
fullchain.pem : the certificate file used in most server software.

# make the files available for a "normal" user
cp privkey.pem fullchain.pem /home/user/
chown user:user /home/user/*pem

# upload the files with your browser

# alternative: use wget or curl for key upload

Der private Schlüssel (privkey.pem) und das Zertifikat mit dem öffentlichen Schlüssel (fullchain.pem) sollten auf einem zusätzlichen Datenträger gesichert werden (Backup). Beide Dateien müssen im Kunden-Informations-System (KIS) von Host Europe unter Produktverwaltung - WebHosting - Konfigurieren - Sicherheit & SSL - SSL administrieren - global hochgeladen werden. Host Europe akzeptiert das PEM-Format.

Zertifikat bei Host Europe hochladen

Zertifikat bei Host Europe hochladen

Das Zertifikat von Let's Encrypt ist nur 3 Monate gültig. Das bedeutet, dass sich das ganze Spiel nach 3 Monaten wiederholt. Ziemlich kompliziert bei Host Europe - ich hoffe, dass sich Host Europe noch bewegt und zusätzlich eine Automatik anbietet. Aus meiner Sicht läuft das bei Goneo etwas besser - auch wenn Goneo beim SSL-Zertifikat bezüglich SAN und dem HSTS Header noch Verbesserungspotential hat.

Bei Host Europe kann HTTP Strict Transport Security (HSTS) in der Datei .htaccess im Root-Verzeichnis konfiguriert werden.

ErrorDocument 404 https://www.example.com

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !^/exception
RewriteCond %{HTTPS} !=On [NC,OR]
RewriteCond %{HTTP_HOST} !=www.example.com [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Header set Strict-Transport-Security "max-age=3600; includeSubDomains" env=HTTPS

Die Umleitungsregeln (RewriteRule) habe ich weiter oben erklärt. Bei Strict-Transport-Security ist 3600 in Sekunden angegeben und bedeutet eine Stunde Speicherzeit der HTTPS-Weiterleitung im Webbrowser. Nach erfolgreicher Einführung von HTTPS und Erfahrung mit der Erneuerung der Zertifikate kann diese Zeit auch auf ein Jahr erhöht werden (31536000 Sekunden).

Auch HostEurope bietet im Paket "WebHosting Basic" keinen SSH-Zugang für das verschlüsselte Hochladen der Dateien auf den Webserver. Deshalb kommt jetzt ein Tipp für verschlüsselten Website-Upload.

Hochladen ohne FTP

Das File Transfer Protocol (FTP) überträgt nicht nur Dateien, sondern auch Passwort und Benutzername unverschlüsselt über das Internet. Ein "Man-In-The-Middle" könnte mit diesen Daten Zugriff auf den Webserver bekommen. Eine Alternative zu FTP wäre das Hochladen über eine verschlüsselte HTTPS-Verbindung. Dazu müssen zunächst zwei Dateien .htaccess und .htusers erstellt werden, die ein upload-Verzeichnis auf dem Webserver mit Benutzername und Passwort schützen.

# content of .htaccess
AuthName "Bitte Passwort eingeben"
AuthType Basic
AuthUserFile /absolute/path/to/root/upload/.htusers
require valid-user

Der Pfad "/absolute/path/to/root" muss mit dem absoluten Pfad des jeweiligen WebHosters angepasst werden. Jetzt muss noch die Datei .htusers erstellt werden.

htpasswd -c .htusers myuser

# enter password

Außerdem wird eine PHP-Datei benötigt, über die eine Datei hochgeladen werden kann: upload.php

cat > upload.php <<EOF
<?php

if (move_uploaded_file(\$_FILES['datei']['tmp_name'], "storage/" . basename(\$_FILES['datei']['name']))) {
  echo "ok<br />";
} else {
  echo "not ok - maybe filename was missing.<br />";
  die();
}

echo "storage/" . basename(\$_FILES['datei']['name']) . "<br />";

passthru("cd ../; tar xzvf upload/storage/package.tgz", \$return_variable);
echo \$return_variable;

?>
EOF

Die drei Dateien können jetzt per FTP zum Webserver hochgeladen werden.

ftp example.com

# create directory upload
mkdir upload
cd upload

# copy the files to the webserver
put .htusers
put .htaccess
put upload.php

# create a storage directory
mkdir storage
exit

Lokale Dateien können dann zum Beispiel mit dem Programm "curl" hochgeladen werden.

# create a package with all files to upload
tar czvf package.tgz file1.txt file2.txt directory

# upload via HTTPS
curl -u user:password -i -X POST -H "Content-Type: multipart/form-data" \
-F "datei=@package.tgz" https://www.example.com/upload/upload.php

Die Domain www.example.com, user und password müssen natürlich ersetzt werden. Die Größe der hochladbaren Datei wird meistens durch den WebHoster begrenzt und kann über "phpinfo" in der Variable post_max_size angesehen werden. Bei Goneo sind es 20 MB und bei Host Europe sind es 32 MB. Größere Dateien können mit dem Linux-Kommando "split" in kleinere Stücke unterteilt werden. Nach dem Upload sollte das Passwort für FTP geändert werden und die Datei .htusers im Upload-Verzeichnis überschrieben werden.

Da das Hochladen über HTTPS nur ein Workaround ist, wäre es wünschenswert, dass die WebHoster auch für kleine WebHosting-Pakete einen verschlüsselten Upload über SFTP anbieten.

Verbleibende Probleme

Ist mit der Verschlüsselung des Datenverkehrs jetzt alles sicher? Leider nein. Es fallen weiterhin Metadaten an, die Aufschluß über die besuchten Webseiten geben können. Nach wie vor kann protokolliert werden, welcher Internet-Nutzer mit welchem Webserver kommuniziert. Wer sich zum Beispiel mit dem fiktiven Server oppositionelle-inhalte.org verbindet, könnte in einem problematischen Staat verdächtigt werden - egal ob die konkrete Seite "meldung1.html" oder "meldung2.html" gelesen wurde. Über die Dateigröße der konkreten HTML-Seite könnte eine Korrelation zur nicht verschlüsselten HTML-Seite hergestellt werden. Desweiteren könnte der Druck durch Sicherheits-Angriffe auf Zertifikatsherausgeber steigen. Im Jahr 2011 gab es zum Beispiel einige erfolgreiche Angriffe auf Zertifikatsherausgeber:

Falls du Fragen oder Hinweise hast, dann schreib einen Kommentar:

Kommentar schreiben

Ihre Daten werden verschlüsselt übertragen. Der Kommentar wird gelesen und eventuell veröffentlicht.
Wenn der Inhalt des Kommentars oder Teile des Kommentars nicht veröffentlicht werden, dann werden die gespeicherten Daten nach maximal 4 Wochen gelöscht. Um zukünftigen Missbrauch der Kommentarfunktion zu verhindern, werden die zum Kommentar gehörenden IP Adressen maximal 4 Wochen gespeichert.