Im Durchschnitt wird dieses Tutorial Nginx mit Let’s Encrypt absichern mit 5 bewertet, wobei 1.0 die schlechteste und 5.0 die beste Bewertung ist. Es haben insgesamt 464 Besucher eine Bewertung abgegeben.
464 0

Nginx mit Let’s Encrypt absichern

vom gridscale Team Linux Basics Nginx Security
tutorial - NGINX mit Let's Encrypt absichern

Let’s encrypt – Einrichtung auf deinem Server

Bei Let’s Encrypt handelt es sich um eine neue Zertifizierungsstelle, die einfache und vor allen Dingen kostenfreie SSL Zertifikate anbietet. Inzwischen ist die CA schon in vielen Browsern hinterlegt, s.d. Let’s Encrypt eine wirklich schnelle und kostengünstige Alternative zum Kauf von Zertifikaten ist. Das Projekt befindet sich aktuell noch in der Beta-Phase, falls es daher zu einer Abweichung zu dieser Anleitung kommt, freuen wir uns über einen kleinen Hinweis.

Der technische Ablauf zu Let’s Encrypt ist auf letsencrypt.org/how-it-works/ beschrieben.

Dieser Artikel beschreibt die Einrichtung auf einem Debian 8 Cloud Server von gridscale, sollte allerdings analog auf Ubuntu, CentOS etc… beliebiger Anbieter anwendbar sein.

Vorbereitung

Debian Cloud ServerAm besten erstellst du dir einen neuen Cloud Server mit unserem Debian Template, dann hast du dieselben Voraussetzungen zu dieser Anleitung und kannst Let’s Encrypt erst einmal ausprobieren, ehe du dann den Schritt machst Let’s Encrypt auf einem produktiven System einzubinden.

Du brauchst für die Einrichtung eine Domain, am besten änderst du schon einmal den A-Record für deine Domain (oder Subdomain) auf die IP deines Cloud Servers (in meinem Fall 185.102.95.17). Je nach Provider dauert das Update der DNS-Zone etwas. Wenn du verhindern möchtest das eine testweise DNS-Abfrage im Cache irgendwelcher Nameserver landet, frag am besten gezielt die Nameserver deines Anbieters ab. Bei mir sieht das wie folgt aus:

$ dig letsencrypt.kmsg.cc @178.254.5.5

...
;; QUESTION SECTION:
;letsencrypt.kmsg.cc. IN A

;; ANSWER SECTION:
letsencrypt.kmsg.cc. 180 IN A 185.102.95.17

Let’s Encrypt verifiziert über den DNS Eintrag, ob Du für die Domain oder Subdomain auch berechtigt bist ein SSL-Zertifikat anzufordern. Diese Art der Validierung ist also rein Domain basierend und lässt alle anderen Informationen außen vor.

Nachdem du die Vorbereitungen abgeschlossen hast, melde dich auf deinem Cloud Server an. Dort muss nun der Let’s Encrypt Client installiert werden.

Installation von Let’s Encrypt

Du brauchst git und bc (und vielleicht ein paar andere Tools mit denen du gerne arbeitest). Am einfachsten installierst du die Pakete mit der folgenden Zeile:

$ apt-get install bc git vim psmisc

Nun kannst du das git-Repository von letsencrypt clonen. Ich lege die Sourcen nach /opt, mittels:

$ git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Cloning into '/opt/letsencrypt'...
remote: Counting objects: 28778, done.
remote: Compressing objects: 100% (66/66), done.
remote: Total 28778 (delta 34), reused 0 (delta 0), pack-reused 28712
Receiving objects: 100% (28778/28778), 7.56 MiB | 4.67 MiB/s, done.
Resolving deltas: 100% (20238/20238), done.
Checking connectivity... done.

damit hast du schon alles auf deinem System, was du brauchst. Auf zum ersten Zertifikat!

Let’s Encrypt Zertifikat erstellen

Let’s Encrypt stellt dir unterschiedliche Wege bereit, um SSL Zertifikate zu erstellen. Standardmäßig unterstützt Let’s Encrypt mit seiner Skriptsammlung bspw. den Apache Webserver, andere Webserver musst du teilweise per Hand konfigurieren um Zertifikate anzufordern und einzubinden. Alternativ kannst du natürlich auch nur Zertifikate anfordern (ohne bspw. die Einbindung in einen Webserver) und dann für deinen Mailserver, Jabber oder sonstige Services nutzen.

In dieser Anleitung nutze ich das ’standalone‘ Plugin von Let’s Encrypt. Dazu wird ein kleiner Webserver auf Port 80 gestartet, über den die Zertifizierung abläuft. Sofern du bereits einen Webserver gestartet hat, solltest du ihn jetzt stoppen (sonst kann Let’s Encrypt nicht am Port 80 lauschen). Ob der Port frei ist, kannst du mit folgendem Befehl prüfen:

$ fuser -n tcp 80

Frei? Dann gehts los. Ansonsten Service stoppen (oder einfach fuser -k -n tcp 80).

Geh in das Source-Verzeichnis und führe aus:

$ ./letsencrypt-auto certonly --standalone

Es werden diverse Pakete nachinstalliert, u.a. python, gcc, diverse libs und ein python virtual environment. Im Anschluss wird eine ncurses Anwendung gestartet, mit der du durch den einfachen Prozess der Zertifikatsausstellung geleitet wirst.

  • Gebe deine E-Mail Adresse ein, die Adresse ist u.a. wichtig, falls du einen SSL Key recovern möchtest.
  • Du wirst gebeten, die Terms of Service zu lesen und zu akzeptieren. Die derzeit aktuelle Version findest du hier.
  • Nun gib deine Domain ein, hier also ‚letsencrypt.kmsg.cc‘. Hast du mehrere CommonName’s, trag sie einfach getrennt mit einem Leerzeichen ein

Let’s Encrypt speichert deine Einstellungen und Accountdaten in /etc/letsencrypt ab, es lohnt sich also dieses Verzeichnis zu sichern.

Im Verzeichnis ‚/etc/letsencrypt/live/‘ werden die Zertifikate abgelegt. Je Domain wird ein Unterverzeichnis angelegt, im vorliegenden Fall also ‚/etc/letsencrypt/live/letsencrypt.kmsg.cc‘.

Der nächste Schritt ist dann also, die Zertifikate in den Webserver einzubinden.

Nginx installieren und konfigurieren

Als erstes installierst du dir (sofern noch nicht passiert) nginx.

$ apt-get install nginx

Für die einfachste Konfiguration editiere die Datei ‚/etc/nginx/sites-enabled/default‘ und suche nach dem folgenden Konfigurationsteil:

server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
#
# listen 443 ssl default_server;
# listen [::]:443 ssl default_server;
#
# Self signed certs generated by the ssl-cert package
# Don’t use them in a production server!
#
# include snippets/snakeoil.conf;

Kommentiere die o.s. Einträge für den Port 80 aus und füge folgende Einträge ein:

server {
listen 80;
server_name letsencrypt.kmsg.cc;
return 301 https://letsencrypt.kmsg.cc/$request_uri;
}

server {
listen 443 ssl default_server;
server_name letsencrypt.kmsg.cc;
ssl_certificate /etc/letsencrypt/live/letsencrypt.kmsg.cc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/letsencrypt.kmsg.cc/privkey.pem;
...

let encrypt certificate

 

Es bietet sich an, nur die sicheren und gängigen SSL Protokolle und Schlüsselverfahren zu aktivieren, dies bewirkst du mit folgenden Konfigurationszeilen im Server-Bereich:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

Speichere die Konfiguration und starte den Nginx neu:

$ /etc/init.d/nginx restart
$ fuser -n tcp 443
443/tcp: 8983 8984 8985 8986 8987

Wenn du jetzt deinen Webserver per https:// aufrufst, solltest du bereits eine verschlüsselte Verbindung aufbauen können, die als sicher eingestuft wird:

Automatische Erneuerung der Zertifikate

Let’s Encrypt stellt die Zertifikate nur für 90 Tage aus, dann müssen sie erneuert werden. Eine automatische Erneuerung der Zertifikate über den Let’s Encrypt Client soll zwar zukünftig eingebaut werden, aber stand heute ist ein wenig Improvisation gefragt.

Anstelle dem zur Erstellung genutzten standalone-Modul von Let’s Encrypt, verwende ich für die Aktualisierung das Webroot Plugin. Das hat den Vorteil, dass ich den Webserver nicht stoppen muss um temporär den Let’s Encrypt Webserver auf Port 80 lauschen zu lassen.

Das Webroot Plugin legt in das Root-Verzeichnis .well-known des Webservers eine spezielle Datei mit einem Token ab, um so die Domain zu validieren.

Am besten testest du zunächst, ob der automatische Prozess überhaupt funktioniert. Dazu rufst du letsencrypt wie folgt auf:

$ ./letsencrypt-auto certonly -a webroot --agree-tos --renew-by-default --webroot-path=/var/www/html/ -d letsencrypt.kmsg.cc

Bekommst du einen Fehler schau am besten in das nginx Logfile, um herauszufinden was während des Aufrufs passiert.

Um nun eine automatische Erneuerung durchzuführen, kannst du entweder direkt die o.s. Kommandozeile in den Cron eintragen, oder du nutzt ein Skript wie z.B. von Mitchell Anicas um die Erneuerungsanfragen durchzuführen.

Hier der Weg mit dem o.s. Script (es nimmt ein paar administrative Tätigkeiten, wie bspw. den Reload des Webservers vor).

$ wget https://gist.github.com/thisismitch/e1b603165523df66d5cc/raw/e04d84ff05fed07acf54bc87068482d3046fc0f7/le-renew-webroot -O /usr/local/bin/le-renew-webroot
chmod 755 /usr/local/bin/le-renew-webroot

Dann öffne die Datei /usr/local/bin/le-renew-webroot und tausch den Pfad für die Konfigurationsdatei aus (oder leg die Konfigurationsdatei an der erwarteten Stelle ab):

config_file="/etc/letsencrypt/le-renew-webroot.ini"

Leg mit dem Editor deiner Wahl nun die Konfigurationsdatei an und schreibe hinein:

email = your@email.tld
domains = letsencrypt.kmsg.cc
webroot-path = /var/www/html

Nun kannst du das Ganze mit dem Aufruf von ‚le-renew-webroot‘ testen. Funktioniert? Prima, dann noch einen cronjob eintragen und du bist fertig:

$ crontab -e
0 1 1 * * le-renew-webroot >> /var/log/le-renewal.log

Update vom 20.02.2016

Nach einigen Rückmeldungen und Nachfragen zu diesem Artikel habe ich eine alternative Lösung dokumentiert. Damit ist der wesentliche Teil der Komplexität aus diesem Artikel entfernt. Guckt euch dazu gerne den Artikel Nginx und Let’s Encrypt Next-Gen-Setup an. Vielen dank für euer Feedback an dieser Stelle.

Let’s encrypt – Einrichtung auf deinem Server Bei Let’s Encrypt handelt es sich um eine neue Zertifizierungsstelle, die einfache und vor allen Dingen kostenfreie SSL Zertifikate anbietet. Inzwischen ist die CA schon in vielen Browsern hinterlegt, s.d. Let’s Encrypt eine wirklich schnelle und kostengünstige Alternative zum Kauf von Zertifikaten ist. Das Projekt befindet sich aktuell […]

Schade, dass dir der Artikel nicht gefallen hat.
Was sollten wir deiner Meinung nach besser machen?

Vielen Dank für dein Feedback!
Wir melden uns bei dir, sobald der Artikel zu deinem Wunschthema fertig ist.

Übrigens: kennst du schon unser Tutorial zum Thema Ein SWAP-File unter Ubuntu 16.04 LTS erstellen?

×

Entwickler?

Dann einfach hier für unsere Tutorial-Updates anmelden.
Keine Sorge: Wir spammen dich nicht zu