Sichere Verbindung über https://

Zusammen mit

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

 

Die Installation von Certbot ab Debian Stretch:

 

sudo apt-get install certbot

 

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

 

sudo systemctl start nginx.service

(sudo /etc/init.d/nginx start)

 

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;

}

 

Datei

 

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

 

sudo /etc/init.d/nginx stop

sudo /etc/init.d/nginx start

 

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.

 

sudo 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.

 

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;

}

}

 

Datei

 

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 /etc/init.d/nginx stop

 

sudo /etc/init.d/nginx start

 

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

 

Datei:

 

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

 

Datei

 

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.