Let’s Encrypt

> Von Christoph Schmidt

Was ist Let’s Encrypt?

Let’s Encrypt[1] ist eine von der Internet Security Research Group (ISRG) betriebene Zertifizierungsstelle (CA, certificate authority), die sich zum Ziel gesetzt hat, das Verschlüsseln von Daten im Internet zum Standard zu machen. Dazu stellt sie kostenlose und leicht installierbare X.509-Zertifikate zur Verfügung, mit denen Internetdienste wie zum Beispiel Webseiten sich im Internet authentifizieren und ihre Daten verschlüsseln können. Nach einer geschlossenen Testphase trat das Projekt am 3. Dezember 2015 in eine öffentliche Testphase ein, in der jeder ein Zertifikat beantragen kann.

Die ISRG ist eine gemeinnützige Organisation mit Sitz in den USA, deren Hauptsponsoren die Electronic Frontier Foundation (EFF), die Mozilla Foundation, Akamai und Cisco Systems sind.

Wozu dienen Zertifikate?

Die von einer CA ausgestellten Zertifikate haben zwei Funktionen: Erstens identifiziert sich der Internetdienst mit diesem Zertifikat, d.h. der Besucher einer Webseite kann sich sicher sein, sich wirklich auf der Seite zu befinden, welche er besuchen wollte. Zweitens wird der Datenverkehr zwischen der besuchten Webseite und dem Rechner des Besuchers verschlüsselt, sodass unbefugte Dritte, die Zugriff auf den Datenstrom haben, diesen nicht mitlesen können.

Webseiten mit einem solchen Zertifikat erkennt man daran, dass die URL (Uniform Resource Locator oder »Internetadresse«) mit https:// anstelle von http:// beginnt. Browser stellen normalerweise auch ein Vorhängeschloss in der Adresszeile vor die URL. Betreibt man nun selbst einen solchen Internetdienst und hat bisher die Komplikationen und/oder Kosten eines Zertifikats gescheut, gibt es nun einen einfachen und kostenlosen Weg, seinen Server mit einem solchen auszustatten.

Let’s Encrypt stellt Zertifikate sowohl für Domains als auch Sub-Domains aus. Eine Domain setzt sich aus dem eigentlichen Domainnamen (z.B. freiesmagazin) und der TLD (Top-Level-Domain, z.B. de) zusammen: freiesmagazin.de. Sub-Domains enthalten einen weiteren vorangestellten Namensteil, welcher sich traditionell auf einen Rechner bezog, z.B. www.freiesmagazin.de. www war früher dabei der Rechner, auf dem der Webserver lief – zu Zeiten, als jeder Service seine eigene Hardware besaß.

Heute werden Sub-Domains häufig bei dynamischem DNS (Domain Name Service) verwendet. Dieser Service wird meist von Privatpersonen in Anspruch genommen, die über einen gewöhnlichen DSL-Anschluss mit dynamischer IP-Adresse mit dem Internet verbunden sind. Dabei ändert der Internet Service Provider (ISP, z.B. Telekom, Vodafone) in regelmäßigen Abständen die IP-Adresse des Anschlusses, sodass der Server im eigenen Heim nicht immer unter der gleichen IP-Adresse vom Internet aus zu erreichen ist. Um dieses Problem zu umgehen, meldet sich der Server nach jeder Änderung der IP-Adresse beim DNS Service, damit dieser die neue IP-Adresse wieder der eigenen Sub-Domain zuweist. Eine solche Sub-Domain hat die allgemeine Form meine-sub-domain.domain.tld, wobei meine-sub-domain ein frei wählbarer Name ist und domain.tld dem DNS-Anbieter gehört.

Installation von Let’s Encrypt

Eines vorneweg: Dieser Artikel beschäftigt sich nicht mit dem Aufsetzen und Konfigurieren eines Webservers, sondern nur mit der Installation und dem Erneuern der Zertifikate. Die Einrichtung eines Webservers würde den Umfang eines einzelnen Artikels bei weitem übertreffen.

Als Beispiel wird in diesem Artikel ein Apache-Webserver auf Debian 8 (»Jessie«) verwendet. Die Installation und Aktualisierung der Zertifikate ist unabhängig vom verwendeten Webserver, lediglich die Einbindung in den Webserver ist verschieden.

Die Let’s Encrypt-Anwendung kann entweder über das Klonen des Projektes von Github oder durch Download eines ZIP-Archivs von dort installiert werden. Let’s Encrypt selbst empfiehlt die Installation von Github wegen der einfacheren Aktualisierung der Anwendung. Dazu muss zuerst git über die Paketverwaltung installiert werden. Anschließend kann das Projekt geklont werden:

$ git clone github.com/letsencrypt/letsencrypt

Nach dem Klonen des Projektes erscheint ein neues Verzeichnis letsencrypt. Zum Aktualisieren wechselt man in das neue Verzeichnis und führt folgenden Befehl aus:

$ git pull

Erstellen des ersten Zertifikates

Zum Erstellen des ersten Zertifikates führt man im Verzeichnis letsencrypt das folgende Kommando aus:

$ ./letsencrypt-auto --server acme-v01.api.letsencrypt.org/directory auth

Läuft der Webserver hierbei hinter einer Firewall, muss sichergestellt sein, dass die Ports 80 (HTTP) und 443 (HTTPS) offen sind. Weiterhin muss der Webserver auch unter der Domain, für die das Zertifikat ausgestellt werden soll, vom Internet aus über DNS erreichbar sein.

Zunächst überprüft letsencrypt-auto, ob irgendwelche Aktualisierungen verfügbar sind, und installiert diese gegebenenfalls. Danach werden dem Anwender einige Fragen gestellt, die zur Erstellung des Zertifikates notwendig sind:

  • Zuerst muss der zu verwendende Webserver angegeben werden. Falls bereits ein Webserver aufgesetzt ist, sollte dieser verwendet werden, da nur ein Webserver auf den HTTP(S) Port zugreifen kann. Ansonsten bietet letsencrypt-auto auch an, einen eigenen Webserver zu verwenden (standalone).
  • Danach wird nach einer E-Mail-Adresse gefragt, unter der das Zertifikat registriert werden soll. Diese wird von Let’s Encrypt für dringende Benachrichtigungen und zur Wiederherstellung verlorener Zertifikate verwendet.
  • Anschließend müssen die Servicebedingungen (terms of service) akzeptiert werden.
  • Zuletzt wird eine Liste mit den Domainnamen abgefragt. Falls Zertifikate für mehr als eine Domain angefordert werden sollen, müssen die Domainnamen mit Komma oder Leerzeichen getrennt werden.

Sobald das Zertifikat erstellt wurde, legt letsencrypt-auto das Verzeichnis /etc/letsencrypt an und speichert dort die Zertifikate unter /etc/letsencrypt/archive/domain.tld/, wobei domain.tld dem Domainnamen entspricht, für welchen das Zertifikat ausgestellt wurde. Alle zukünftigen Zertifikate werden ebenfalls in diesem Verzeichnis abgelegt und durchnummeriert. Das letzte aktuell gültige Zertifikat wird im Verzeichnis /etc/letsencrypt/live/domain.tld/ verlinkt. Von dort sollte der Webserver auch das Zertifikat lesen, da der Link bei jeder Aktualisierung des Zertifikats entsprechend angepasst wird.

Einbinden der Zertifikate

Nachdem die Zertifikate nun auf dem Server installiert sind, müssen diese auch noch im Webserver eingebunden werden. Dies kann entweder automatisch oder manuell erfolgen. Für die automatische Installation muss beim Erstellen des Zertifikates lediglich letsencrypt-auto run anstelle von letsencrypt-auto auth angegeben werden oder – falls die Zertifikate bereits erstellt wurden – letsencrypt-auto install. Die automatische Installation funktioniert derzeit sowohl mit Apache und – momentan noch als Beta – mit NGINX.

Wer nicht möchte, dass letsencrypt-auto die Konfiguration seines Webservers automatisch verändert, kann die Zertifikate auch manuell einbinden. Hierzu muss zuallererst das SSL-Modul in Apache aktiviert werden:

# a2enmod ssl

Danach muss ein virtueller Host für SSL angelegt werden. Hierfür erstellt man eine neue Datei im Verzeichnis /etc/apache2/sites-available. Der Dateiname ist hierbei irrelevant, es empfiehlt sich aber, den Domainnamen im Dateinamen unterzubringen, zum Beispiel ssl.domain.tld.conf, damit man bei diversen Domains die entsprechende Datei schnell findet. Ein minimaler Inhalt für diese Datei könnte der Folgende sein:

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
 
        SSLEngine on
 
        SSLCertificateFile      /etc/letsencrypt/live/domain.tld/cert.pem
        SSLCertificateKeyFile   /etc/letsencrypt/live/domain.tld/privkey.pem
        SSLCertificateChainFile /etc/letsencrypt/live/domain.tld/chain.pem
 
    </VirtualHost>
</IfModule>
  • SSLEngine: Diese Anweisung aktiviert das SSL/TLS Protokoll für diesen virtuellen Host.
  • SSLCertificateFile: Dies ist der öffentliche Teil des Zertifikat-Schlüssels.
  • SSLCertificateKeyFile: Dies ist der private Teil des Zertifikats-Schlüssels.
  • SSLCertificateChainFile: Diese Datei enthält alle öffentlichen Zertifikat-Schlüssel der CAs, welche das Zertifikat ausgestellt haben.

Anzumerken bleibt noch, dass die oben gezeigte Datei lediglich eine minimale Konfiguration des virtuellen Hosts darstellt. Abhängig vom Einsatzzweck muss die Konfiguration deshalb noch entsprechend erweitert werden. Dazu ist entweder die Dokumentation der verwendeten Distribution oder die der Apache Foundation[2] zu Rate zu ziehen.

Möchte man jede HTTP-Verbindung auf HTTPS umleiten, kann man dafür einen weiteren virtuellen Host anlegen, welcher auf dem HTTP-Port 80 lauscht und die Anfragen entsprechend umleitet:

<VirtualHost *:80>
        RewriteEngine on
        RewriteRule ^ %{HTTP_HOST}/%{REQUEST_URI} [L,QSA,R=permanent]
</VirtualHost>
  • RewriteEngine: Diese Anweisung erlaubt das Ändern von URLs.
  • RewriteRule: Mit dieser Anweisung werden alle HTTP-Anfragen auf HTTPS umgeleitet. Der Rest der URL bleibt dabei unverändert, zum Beispiel domain.tld/login wird zu domain.tld/login. HTTP_HOST entspricht hierbei der Domain (domain.tld) und REQUEST_URI der angeforderten Seite (login).

Nachdem die virtuellen Hosts eingerichtet sind, müssen diese noch aktiviert werden:

# a2ensite ssl.domain.tld

Dieser Befehl legt einen Link in /etc/apache2/sites-enabled auf die neue Seite in /etc/apache2/sites-available an. Sollten bereits Seiten eingerichtet sein, muss man diese gegebenenfalls mit a2dissite deaktivieren oder mit der Anweisung ServerName in der Konfiguration des virtuellen Hosts (in /etc/apache2/sites-available) auf bestimmte Hosts beschränken, um Konflikte zu vermeiden.

Zuletzt wird der Webserver neu gestartet:

# apache2ctl restart

Aktualisieren der Zertifikate

Die von Let’s Encrypt ausgestellten Zertifikate sind nur drei Monate lang gültig. Um nach Ablauf dieses Zeitraums ein neues Zertifikat zu beantragen, kann man die oben beschriebenen Schritte wiederholen oder aber den ganzen Prozess automatisieren. Hierfür müssen lediglich die Antworten für die von letsencrypt-auto gestellten Fragen bereits beim Aufruf mitgeliefert werden. Dies geschieht entweder über die Kommandozeilen-Parameter oder man legt die Konfigurationsdatei cli.ini im Verzeichnis /etc/letsencrypt entsprechend an:

server = acme-v01.api.letsencrypt.org/directory
email = webmaster@domain.tld
authenticator = webroot
webroot-path = /var/www/html/
domains = domain.tld
agree-tos = True
renew-by-default = True
  • server: Hiermit wird der Server angegeben, von dem das Zertifikat bezogen werden soll, d.h. der Let’s Encrypt Server.
  • email: Dies ist die Kontakt-E-Mail für dringende Benachrichtigungen und die Wiederherstellung verlorener Zertifikate.
  • authenticator/webroot-path: Mithilfe dieser Anweisung teilt man letsencrypt-auto mit, dass man zur Authentifizierung einen bereits aufgesetzten Webserver verwenden möchte. letsencrypt-auto wird dann im Verzeichnis webroot-path ein Unterverzeichnis .well-known anlegen, das eine Datei zur Authentifizierung enthält. Mithilfe dieser Datei wird dann sichergestellt, dass der Antragsteller auch wirklich Zugriff auf die Domain besitzt und nicht ein Zertifikat für eine andere, seinem Zugriff nicht unterliegende, Domain anfordert. Der Wert für webroot-path hängt von der verwendeten Distribution und Version ab, ist aber meistens entweder /var/www oder /var/www/html.
  • domains gibt die Domain an, für welche das Zertifikat ausgestellt werden soll.
  • agree-tos: Hiermit werden die Servicebedingungen bestätigt.
  • renew-by-default: Dies fordert ein neues Zertifikat an anstelle einer neuen Kopie des bereits vorhandenen Zertifikats.

Der automatisierte Ablauf kann nun getestet werden, indem man letsencrypt-auto auth als root ausführt. Dabei sollten keine interaktiven Abfragen mehr erscheinen. Anzumerken bleibt noch, dass Let’s Encrypt nur zehn Anfragen pro Domain und Tag zulässt, man muss sich also mit seinen Versuchen etwas zurückhalten.

Funktioniert die Aktualisierung des Zertifikats ohne weitere Interaktion, kann man zum Beispiel eine ausführbare Datei update-cert in /etc/cron.monthly/ mit folgendem Inhalt erstellen:

#!/bin/sh
 
/path/to/letsencrypt-auto auth
apache2ctl restart

Damit wird jeden Monat automatisch ein neues Zertifikat angefordert. /path/to/ muss natürlich noch mit dem Installationsverzeichnis von letsencrypt-auto ersetzt werden.

Fazit

Wer sich bereits etwas mit Webservern auskennt, hat nun einen einfachen und kostenlosen Weg, seinen Server mit einem Zertifikat auszustatten. Auch wenn das Versprechen von Let’s Encrypt, eine Ein-Klick-Lösung anzubieten, noch nicht ganz erreicht ist, dürfte die Installation auch für Hobby-Administratoren zu machen sein.

Die von Let’s Encrypt ausgestellten Zertifikate werden momentan von allen aktuellen Browsern aus den Häusern Microsoft, Google und Mozilla anerkannt. Apple konnte mangels Apple-Geräten nicht getestet werden.

In diesem Sinne: Let’s Encrypt!

Autoreninformation

Christoph Schmidt ist ein Hobby-Linuxer, welcher unter Verständnislosigkeit seiner Umwelt versucht, möglichst viel seiner privaten IT auf FOSS-Lösungen umzustellen.

Dieser Artikel ist in freiesMagazin 01/2016[3] (ISSN 1867-7991) erschienen. Veröffentlichung mit freundlicher Genehmigung.

Linkverweise:


[1] letsencrypt.org/ 
[2] httpd.apache.org/docs/ 
[3] www.freiesmagazin.de/20160103-januarausgabe-erschienen

http://www.pro-linux.de/images/NB3/base/print/nb3_logo.png

Mediadaten RSS/Feeds Datenschutz Impressum

© 2017 Pro-Linux

 

Schreibe einen Kommentar