Nginx und Let’s Encrypt auf Raspberry Pi

Mit Let’s Encrypt lassen sich kostenlose SSL Zertifikate erstellen, die von allen gängigen Browsern akzeptiert werden ohne eigene Root Zertifikate hinzufügen zu müssen. Gerade im Consumer-Bereich werden viele Einplatinencomputer wie der Raspberry Pi oder Banana Pi als Webserver verwendet, um gewisse Dienste über das Internet zu veröffentlichen. Mit HTTPS verschlüsselten Verbindungen zum eigenen Webserver wird die Sicherheit erhöht, da keine Kommunikation mehr im Klartext über die Leitung geht und somit nicht mehr bzw. nur mit deutlich erhöhtem Aufwand abgehört werden kann. Als Webserver empfiehlt sich auf dem Raspberry Pi „nginx“ (Engine-X ausgesprochen), da dieser trotz extremer Leistungsfähigkeit sehr wenig Ressourcen benötigt.

Dieser Beitrag zeigt die Installation und Konfiguration von nginx und Let’s Encrypt bzw. dem dazu benötigten Client „Certbot“ auf einem Raspberry Pi mit installiertem Raspbian, um zukünftig verschlüsselte Kommunikation mit einem kostenlosen Zertifikat zu ermöglichen. Als Voraussetzung wird entweder eine bestehende DynDNS Konfiguration oder ein CNAME DNS Eintrag benötigt, um den Webserver per URL zu erreichen. Ebenso muss der Webserver von außen über Port 80 und 443 erreichbar sein.

Als erstes wird wie immer das installierte Raspbian auf den aktuellen Stand gebracht.

sudo apt-get update && sudo apt-get upgrade

Nach der Aktualisierung wird der Webserver „nginx“ installiert.

sudo apt-get install nginx

Um den Let’s Encrypt Client „Certbot“ installieren zu können, müssen unter Debian Jessie die Backports aktiviert werden. Wie das geht, steht hier beschrieben: Klick. Danach kann Certbot installiert werden. Wer bereits Debian Stretch einsetzt, kann Certbot direkt aus dem stable Repository heraus installieren und muss nicht auf die Backports zurückgreifen.

Die Installation von Certbot ab Debian Stretch:

sudo apt-get install certbot

Die Installation von Certbot unter Debian Jessie:

sudo apt-get install certbot -t jessie-backports

Bevor die Zertifikate erzeugt werden können, muss der Webserver konfiguriert werden. Dazu wird dieser erstmal gestartet.

sudo systemctl start nginx.service

Damit bei einem Neustart des Systems der Webserver auch gestartet wird, muss folgender Befehl ausgeführt werden.

sudo systemctl enable nginx.service

Für die eigene Domain wird ein eigenes Verzeichnis im Webroot angelegt.

sudo mkdir /var/www/yourdomain.com

Als nächstes wird die Grundkonfiguration des Webservers durchgeführt. In der Standardinstallation von nginx wird bereits eine Beispiel Konfigurationsdatei mit ausgeliefert. Diese liegt unter „/etc/nginx/sites-available/default“. Alle Dateien die unterhalb von „sites-available“ liegen und als Link unter „/etc/nginx/sites-enabled/“ zu finden sind, werden von nignx angewendet. Da die Beispielkonfiguration nicht verwendet wird, kann der Link gelöscht werden. Die original Datei bleibt dabei erhalten.

sudo rm /etc/nginx/sites-enabled/default

Die eigentliche Datei für den Webauftritt wird unter „/etc/nginx/conf.d/“ abgelegt. Hier werden alle Dateien mit der Endung „.conf“ automatisch von nginx berücksichtigt.

sudo nano /etc/nginx/conf.d/yourdomain.com.conf

Zu Beginn wird nur die „http“ Sektion eingetragen. Sobald später das Zertifikat vorhanden ist, werden die „https“ Einstellungen hinzugefügt. Der Wert „yourdomain.com“ ist an die eigene Domain anzupassen, über die auf den Webserver zugegriffen wird. Dies kann natürlich auch eine DynDNS Domain sein. Der Paramter „return“ bleibt vorerst noch auskommentiert.

server {
        listen 80 default_server;
        server_name yourdomain.com;
        #return 301 https://$server_name$request_uri;
        root /var/www/yourdomain.com;
        index index.php index.htm index.html;
}

raspi_nginx_01

Um die Änderungen zu aktivieren, muss der Webserver einmal neu gestartet werden.

sudo systemctl restart nginx.service

Der Zugriff über die Domain auf den Webserver sollte jetzt per http funktionieren. Dazu muss natürlich unterhalb von „/var/www/yourdomain.com“ eine entsprechende index Datei liegen. Im nächsten Schritt wird das Let’s Encrypt Zertifikat auf dem Raspberry Pi erzeugt. Dabei wird im Beispiel je ein Zertifikat für „yourdomain.com“ und „www.yourdomain.com“ erzeugt. Die Parameter müssen hier natürlich an die eigenen Informationen angepasst werden.

certbot certonly --webroot -w /var/www/yourdomain.com -d yourdomain.com -d www.yourdomain.com

Hat alles funktioniert, kann die SSL Konfiguration im Webserver hinzugefügt werden. Dazu wird zusätzlich zur bestehenden „http“ Sektion noch der „https“ Bereich eingetragen.

sudo nano /etc/nginx/conf.d/yourdomain.com.conf
server {
        listen 80 default_server;
        server_name yourdomain.com;
        return 301 https://$server_name$request_uri;
	root /var/www/yourdomain.com;
        index index.php index.htm index.html;
}

server {
        listen 443 ssl default_server;
        server_name yourdomain.com;

	##
	# SSL
	## 

        ssl on;
        ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_ciphers  HIGH:!aNULL:!MD5:!RC4;
        
	##
	# HSTS
	##

	add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

	##
	# global
	##

        root /var/www/yourdomain.com;
        index index.php index.htm index.html;

	location / {
                try_files $uri $uri/ =404;
        }

}

raspi_nginx_02

Wer möchte, kann nun auch in der „http“ Sektion das Kommentarzeichen in der Zeile „return“ entfernen. Dadurch wird ein Zugriff über https erzwungen. Jeder Versuch die Seite per http aufzurufen, wird direkt auf https umgeleitet. Damit die neuen Einstellungen greifen, muss der Webserver nochmal neu gestartet werden.

sudo systemctl restart nginx.service

Ab jetzt ist die Seite komplett SSL verschlüsselt über ein kostenloses Let’s Encrypt Zertifikat erreichbar. Da die Zertifikate nur eine Lebensdauer von 90 Tagen haben, müssen diese regelmäßig erneuert werden. Dies lässt sich natürlich auch automatisieren, indem der Befehl „certbot renew –quiet“ ausgeführt wird. Durch die Installation von Certbot wird bereits automatisch ein Cronjob unter „/etc/cron.d/certbot“ eingerichtet, der diese Aufgabe erledigt. Allerdings wird hierbei der Webserver danach nicht neu geladen. Somit werden die neuen Zertifikate nicht angewendet. Die Zeile kann komplett auskommentiert werden, damit der Cronjob nicht ausgeführt wird.

sudo nano /etc/cron.d/certbot
#0 */12 * * * root test -x /usr/bin/certbot && perl -e 'sleep int(rand(3600))' && certbot -q renew

Die tatsächliche Verlängerung des Zertifikats wird mit einem Systemd Timer durchgeführt. Dazu wird erstmal der tatsächliche Dienst angelegt.

sudo nano /etc/systemd/system/certbot.service
[Unit]
Description=Let's Encrypt renewal

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --agree-tos
ExecStartPost=/bin/systemctl reload nginx.service

Zusätzlich zum Dienst wird jetzt der Timer benötigt, der den Prozess täglich ausführt. Certbot prüft hier zu Beginn, ob tatsächlich eine Verlängerung benötigt wird.

sudo nano /etc/systemd/system/certbot.timer
[Unit]
Description=Daily renewal of Let's Encrypt's certificates

[Timer]
OnCalendar=daily
RandomizedDelaySec=1day
Persistent=true

[Install]
WantedBy=timers.target

Der Timer wird jetzt gestartet und auf aktiv gesetzt.

sudo systemctl start certbot.timer
sudo systemctl enable certbot.timer

Der Status der Ausführung lässt sich bei Bedarf mit „journalctl“ prüfen.

sudo journalctl -u certbot

Und jetzt viel Spaß mit nginx und einem kostenlosen Let’s Encrypt Zertifikat auf Eurem Raspberry Pi. Für Fragen und Anregungen stehen die Kommentare zur Verfügung.

Ähnliche Beiträge:

Kommentare sind geschlossen.