Nginx mit SSL und Let's Encrypt absichern
Hinweis: Wenn man den Client und Pakete die für ihn benötigt werden nicht zusätzlich auf seinem Server installieren will kann man auch mit der Hilfe einer Webseite die einzelnen Schritte zur Ausstellung des Zertifikats manuell durchführen.
Seit dem 3. Dezember 2015 befindet sich Let’s Encrypt in der Public Beta. Das bedeutet man kann sich ohne vorherige Registrierung und Wartezeit ein kostenloses SSL Zertifikat für seine Domain erstellen. Für mein “Heimcloud” nutze ich einen Cubietruck (ähnlich zum weitaus bekannteren Raspberry Pi) mit Nginx. Dieser Artikel zeigt wie ich Nginx mit einem SSL-Zertifikat von Let’s Encrypt eingerichtet habe.
Als erstes musss der Let’s Encrypt Client installiert werden. Dabei werden alle benötigten Debian-Pakete installiert:
hostname:~# git clone https://github.com/letsencrypt/letsencrypt hostname:~# cd letsencrypt hostname:~/letsencrypt# ./letsencrypt-auto
Für Nginx gibt es noch kein Plugin das die Installation des Zertifikats automatisch vornimmt. Deshalb wird als Plugin standalone verwendet und die Nginx Konfiguration danach manuell angepasst. Zur Validierung der Domain (nicht das man sich ein Zertifikat für eine Domain ausstellt die man gar nicht administriert) werden Port 80 oder 443 genutzt. Da Nginx auf diesen Ports lauscht muss er während der Ausstellung des Zertifikats gestoppt werden. In meinem Fall habe ich kein Problem damit wenn der Webserver kurz nicht verfügbar. Alternativ kann die Domain auch über ein Verzeichnis im Webroot validiert werden:
hostname:~# sudo /etc/init.d/nginx stop hostname:~# ./letsencrypt-auto certonly -d example.krausmueller.de hostname:~# sudo /etc/init.d/nginx start
Wenn alles geklappt hat liegen die Dateien des Zertifiktas unter /etc/letsencrypt/live/example.krausmueller.de/:
hostname:~# sudo ls /etc/letsencrypt/live/example.krausmueller.de/ cert.pem chain.pem fullchain.pem privkey.pem
Neben dem Zertifikat sollte man noch seien eigenen Diffie-Hellman-Parameter erstellen:
hostname:~# sudo openssl dhparam -out /etc/nginx/dhparams.pem 2048
Eine möglichst sichere Konfiguration für Nginx lässt sich mit dem Mozilla SSL Configuration Generator erstellen. Wichtig ist es dabei die richtige Version des Servers und von OpenSSL einzutragen. Die für meine Zertifikate angepasste Konfiguration:
|
|
Nach einem Neustart des Nginx sollte ein Test bei SSL Labs jetzt ein “A Rating” ergeben.
Zertifikate von Let’s Encrypt sind lediglich 90 Tage gültig und müssen deshalb regelmäßig erneuert werden. Am einfachsten lässt sich das über einen Cronjob erledigen. Bei diesem Beispiel wird das Zertifikat jeden 2. Monat am 28. (wichtig durch möglichen Schalttag im Februar) erneuert:
hostname:~# crontab -l # m h dom mon dow command 0 1 28 2,4,6,8,10,12 * sudo /etc/init.d/nginx stop; /home/user/letsencrypt/letsencrypt-auto certonly --renew -d example.krausmueller.de; sudo /etc/init.d/nginx start