Let's encrypt

SSL Zertifikate für Nginx

Sebastian Rückerl

Auch wenn noch nicht alles fertig ist möchte ich hier mit dem ersten Artikel beginnen. Zum einen in der Hoffnung, dass es jemand nützlich findet, zum anderen aber auch um es selbst nicht zu vergessen.

Da es seit Dezember die SSL Zertifikate von Let’s encrypt für jeden gibt, dachte ich mir es ist an der Zeit dies mal zu testen. Doch wie beginnen?

Zuerst muss man sich für einen Weg entscheiden die Zertifikate zu bekommen. Soweit ich das bisher weiß gibt es grundsätzlich drei Arten dies zu tun. Man kann

  • den offiziellen, alles-in-einem-letsencrypt Client verwenden, oder
  • einen anderen Client verwenden der zumindest einige Schritte automatisiert, oder
  • alle Schritte von Hand durchführen.

Natürlich hat jeder dieser Wege seine Vor- und Nachteile und jeder muss für sich selbst abwägen was für ihn am wichtigsten ist. Der offizielle Client bietet den größten Komfort, hat jedoch den großen Nachteil, dass er als root ausgeführt werden muss. Dies ermöglicht hier theoretisch das installieren ungewollter Software auf dem System. Ich habe mich trotz dieser Bedenken für diesen Weg entschieden, da er mir am einfachsten erscheint und ich davon ausgehe, dass man diesem Client vertrauen kann. Diese Entscheidung muss allerdings jeder für sich selbst treffen!

Installation

Die Installation des Clients ist denkbar einfach und auf Github gut dokumentiert. Es ist lediglich das Github repository zu klonen, die benötigten Abhängigkeiten werden dann beim ersten ausführen automatisch installiert.

1
2
user@server:~$ git clone https://github.com/letsencrypt/letsencrypt
user@server:~$ cd letsencrypt

Nun kann letsencrypt verwendet werden. Wie in der Dokumentation beschrieben kann hierfür letsencrypt-auto verwendet werden. Für das Anzeigen der Hilfe führt man beispielsweise

1
user@server:~/letsencrypt$ sudo ./letsencrypt-auto --help

aus. Dies kann beim ersten Start etwas länger dauern, da alle Abhängigkeiten erst Installiert werden müssen. Schlägt dies fehl so liegt es daran, dass vermutlich nicht alle benötigten Pakete installiert werden konnten. Bei mir trat der Fehler unter anderem auf, da mein /tmp-Verzeichnis zu klein war und einige Downloads so fehlgeschlagen sind. Ein vergrößern und erneutes ausführen half aber sofort weiter.

Zertifikat erzeugen

Um sein Zertifikat zu erzeugen und die Adressen verifizieren zu lassen hat man nun die Wahl zwischen verschiedenen Plugins:

  • apache: Erzeugt, verifiziert und installiert vollautomatisch bei bestehendem Apache-Webserver
  • standalone: Startet einen eigenen Webserver um die Adressen zu verifizieren
  • webroot: Nutzt einen anderen Webserver
  • manual: Unterstützt lediglich beim durchführen der Validierung
  • nginx (experimentell): Wie apache, jedoch für den Nginx-Webserver

Was das im einzelnen Bedeutet kann in der Dokumentation nachgelesen werden. Da ich nicht wollte, dass ein Script die Konfiguration meines Nginx-Webservers verändert und dieses Plugin obendrein experimentell ist, habe ich mich für die webroot-Variante entschieden.

Nginx Konfiguration anpassen

Für diese Variante ist es zuerst notwendig die Konfiguration des Nginx-Servers anzupassen um letsencrypt-auto die Möglichkeit zu geben ihn zu nutzen. Genauer gesagt muss man ein Verzeichnis vorgeben, das später unter http://domainname.endung/.well-known/acme-challenge/* erreichbar ist. Diese Konfiguration kann beispielsweise so aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
        listen 80;
        server_name dl8rs.de www.dl8rs.de;
        
        location /.well-known/acme-challenge {
                default_type "text/plain";
                root /var/www/letsencrypt;
                try_files $uri $uri/ =404;
        }
        location / {
                return 301 https://www.dl8rs.de$request_uri;
        }
}

Wie man erkennt werden hier alle für letsencrypt-auto wichtigen Zugriffe in ein entsprechendes Verzechnis geleitet. Der restliche Verkehr wird umgeleitet um https zu erzwingen. Diese Konfiguration muss anschließend noch neu geladen werden

1
user@server:~$ sudo service nginx reload

Zertifikat erstellen

Ist der Server Konfiguriert kann das Zertifikat einfach erzeugt werden. Hierzu ist

1
2
user@server:~/letsencrypt$ sudo ./letsencrypt-auto certonly --webroot \
-w /var/www/letsencrypt/ -d dl8rs.de -d www.dl8rs.de

auszuführen. Dadurch wird ein Zertifikat gültig für dl8rs.de und www.dl8rs.de erzeugt und in /etc/letsencrypt/live/dl8rs.de abgelegt. Mit -w wird das Verzeichnis für die Adressvalidierung angageben. Jede mit -d angegebene Adresse wird mit in das Zertifikat aufgenommen, wobei die erste Adresse entscheidend für den Speicherpfad des Zertifikats ist.

Beim ersten ausführen wird zusätzlich ein Benutzer angelegt. Dabei wird man aufgefordert seine E-Mail Adresse anzugeben. Dies ist auch wichtig, da an diese E-Mail später die Information verschickt wird, dass das Zertifikat bald ablaufen wird.

Zertifikat verwenden

Um nun dieses Zertifikat auch zu verwenden ist noch die Konfiguration des Nginx-Webservers entsprechend anzupassen und ein Serverblock für den https-Teil zu erstellen. Dieser könnte in etwa so aussehen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
        listen 443 ssl;

        root /var/www/dl8rs;
        index index.html index.htm;

        server_name dl8rs www.dl8rs.de
        location / {
                expires 2h;
                try_files $uri $uri/ =404;
        }
        ssl on;
        ssl_certificate /etc/letsencrypt/live/dl8rs.de/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/dl8rs.de/privkey.pem;
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "EECDH+EASGCM:EDH+AESGCM:AES256+EECDM:AES256+EDH";
        ssl_prefer_server_ciphers on;

        ssl_stapling on;
        ssl_stapling_verify on;

        ssl_trusted_certificate /etc/letsencrypt/live/dl8rs.de/chain.pem;
}

Wichtig sind hierbei die Zeilen 13, 14 und 26, da sie die Pfade zum Zertifikat und dem privaten Schlüssel angeben. Natürlich ist dies bei weitem keine perfekte Konfiguration und soll es hier auch gar nicht sein. Sie zeigt aber durchaus die benötigten Teile auf um einen Server laufen zu lassen.

Um die Änderungen zu übernehmen ist zum Schluss nur noch ein neu laden der Konfiguration erforderlich.

1
user@server:~$ sudo service nginx reload

Ich hoffe dieser Artikel hilft dem ein oder anderen bei seinen ersten Versuchen mit Let’s encrypt weiter. Falls ihr noch Fragen habt, könnt ihr die gerne über die Kommentarfunktion stellen. Ansonsten gibt es jetzt keine Ausreden mehr seine Dienste im Internet ohne https anzubieten :-).

Under Construction

Langsam aber sicher findet diese Seite ihren Anfang

Sebastian Rückerl

Leider gibt es hier noch keine Beiträge oder andere spannende Dinge zu entdecken. Dies wird sich jedoch hoffentlich bald ändern.

Bis es soweit ist, möchte ich euch allen ein gutes Neues Jahr 2016 Wünschen. Ich hoffe wir sehen uns hier bald wieder.