joachim-wilke.de ab sofort nur noch über HTTPS abrufbar

Meine Webseite ist ab sofort nur noch über HTTPS abrufbar, die Zertifikate dazu werden von der letsencrypt-Initiative ausgestellt.

Die letsencrypt-Initiative hat sich zum Ziel gesetzt den Prozess der Zertifikatserstellung und -verwendung soweit zu vereinfachen und automatisieren, dass dies kostenlos und ohne Vorkenntnisse für jeden Webmaster möglich ist und trotzdem sicher bleibt. Mehr zur letsencrypt-Initiative gibt es auf deren Webseite. Das Projekt befindet sich momentan in einer geschlossenen Beta-Phase, ab dem 03.12.2015 soll der Dienst für alle zur Verfügung stehen.

Auf der Webseite wird der Python-Client letsencrypt zur Erstellung und Verlängerung von Zertifikaten bereitgestellt, der den Prozess weitgehend automatisiert. Wenn man einen Apache oder Nginx Webserver betreibt kann der Client sogar die Konfiguration automatisch anpassen, so dass eigentlich nur noch der Client mit Root-Rechten aufgerufen wird.

Update 2016-06-13: Der Python-Client wurde in certbot umbenannt.

Alternativ dazu ist es auch möglich, mit dem Client nur die Zertifikate zu erzeugen und die Konfiguration von Hand durchzuführen. Diesen Weg habe ich gewählt:

1
2
3
4
letsencrypt certonly --authenticator webroot --webroot-path /path/to/website \
-d www.joachim-wilke.de -d joachim-wilke.de \
--server https://acme-v01.api.letsencrypt.org/directory \
--agree-dev-preview

Update 2016-06-13: Die Parameter --server und --agree-dev-preview sind mittlerweile nicht mehr nötig, da das Programm seine Beta-Phase verlassen hat.

Dadurch werden folgendende Schritte angestossen:

  • Der Client beantragt bei letsencrypt Server acme-v01.api.letsencrypt.orgein neues Zertifikat mit den gewünschten Parametern, er erstellt dazu einen privaten Key und einen Zertifikats-Request
  • Der Server möchte als Berechtigungsnachweis eine bestimmte Datei über die Webseite abrufen, diese hat die Form http://www.joachim-wilke.de/.well-known/acme-challenge/<unique-filename>
  • Der Client stellt diese Datei bereit, da er kennt den webroot /path/to/website kennt kann er dort die bentöigte Datei ablegen
  • Der Server ruft das File ab und stellt das Zertifikat aus
  • Privater Schlüssel und Zerifikat werden unter /etc/letsencrypt/live bereitgestellt.

Dieses Vorgehen ist die Umsetzung des ACME-Protokolls (Automated Certificate Management Environment). Die genannten Details muss man für die reine Verwendung natürlich nicht kennen.

Danach muss nur noch die Webseiten-Konfiguration angepasst werden, für Apache in meinem Fall wie folgt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<VirtualHost *:80>
ServerName www.joachim-wilke.de
ServerAlias joachim-wilke.de
Redirect permanent / https://www.joachim-wilke.de/
</VirtualHost>
<VirtualHost *:443>
ServerName www.joachim-wilke.de
ServerAlias joachim-wilke.de
DocumentRoot /path/to/website
SSLEngine On
SSLProtocol all -SSLv2 -SSLv3
SSLCertificateKeyFile /etc/letsencrypt/live/www.joachim-wilke.de/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/www.joachim-wilke.de/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.joachim-wilke.de/chain.pem
</VirtualHost>

Damit werden alle eingehenden Anfragen (auch über http) auf die gesicherte Seite geleitet und das soeben erstellte Zertifikat verwendet. Im Browser sieht das dann so aus:

Auch Google berücksichtigt die Erreichbarkeit per HTTPS und rankt entsprechende Webseiten besser:

Fertig!

Update 2016-06-13:

Alternativ zum oben gezeigten Weg ist auch der Authenticator standalone praktisch. Hier darf kein Webserver laufen, statt dessen stellt das Python-Skript diesen selbst zu Verfügung.

1
2
certbot certonly --authenticator standalone \
-d www.joachim-wilke.de -d joachim-wilke.de