HTTPS mit Letsencrypt einrichten

Der Webserver nginx den wir im Artikel nginx als Webserver installieren eingerichtet haben jetzt auch durch den Externen Hostnamen per DDNS aus dem Internet erreichbar ist, soll die Datenübertragung verschlüsselt werden. Dadurch kann der Inhalt der Seiten nicht vom Internetanbieter oder WLAN-Betrieber mitgelesen oder verändert werden. So gab es schon Internetanbieter, die Werbung in fremde […]

Der Webserver nginx den wir im Artikel nginx als Webserver installieren eingerichtet haben jetzt auch durch den Externen Hostnamen per DDNS aus dem Internet erreichbar ist, soll die Datenübertragung verschlüsselt werden. Dadurch kann der Inhalt der Seiten nicht vom Internetanbieter oder WLAN-Betrieber mitgelesen oder verändert werden. So gab es schon Internetanbieter, die Werbung in fremde Seiten eingefügt haben oder Mobilfunkbetreiber die Inhalte verändern um diese angeblich schneller auszuliefern und dabei Seiten durch diese Optimierungen unbrauchbar gemacht haben.

jessie-backports konfigurieren

Da das Paket von Certbot nicht in der aktuellen Version von Raspbian vorhanden ist, müssen die jessie-backports zu deinen Paketquellen hinzugefügt werden.

GPG-Schlüssel hinzufügen

Die GPG-Schlüssel werden für die neuen Paketquellen benötigt.

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7638D0442B90D010
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B48AD6246925553

jessie-backports hinzufügen

echo "deb http://httpredir.debian.org/debian jessie-backports main contrib non-free" | sudo tee -a /etc/apt/sources.list.d/jessie-backports.list

Da die Liste der Paketquellen aktualisiert wurde, muss noch apt update ausgeführt werden, um die Liste der neuen Pakete der hinzugefügten Quelle zu laden.

sudo apt update

Certbot installieren

Mit dem Certbot können neue Zertifikate kostenlos für HTTPS bei Letsencrypt beantragt und auch regelmässig aktualisiert werden. Da das Aktualisieren per Cronjob automatisch vom Server übernommen wird, musst du nicht mehr auf das Ablaufdatum deiner Zertifikate achten – was leider bei kommerziellen Anbietern immer noch der Fall ist.

sudo apt install -t jessie-backports certbot
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.       
Statusinformationen werden eingelesen.... Fertig
Die folgenden zusätzlichen Pakete werden installiert:
  python-acme python-certbot python-cffi-backend python-chardet python-configargparse python-configobj python-cryptography python-dnspython python-enum34
  python-funcsigs python-idna python-ipaddress python-mock python-ndg-httpsclient python-openssl python-parsedatetime python-pbr python-pkg-resources
  python-psutil python-pyasn1 python-pyicu python-requests python-rfc3339 python-setuptools python-six python-tz python-urllib3 python-zope.component
  python-zope.event python-zope.interface
Vorgeschlagene Pakete:
  python-certbot-apache python-certbot-doc python-acme-doc python-configobj-doc python-cryptography-doc python-cryptography-vectors python-enum34-doc
  python-funcsigs-doc python-mock-doc python-openssl-doc python-openssl-dbg python-psutil-doc doc-base python-socks python-setuptools-doc python-ntlm
Die folgenden NEUEN Pakete werden installiert:
  certbot python-acme python-certbot python-cffi-backend python-chardet python-configargparse python-configobj python-cryptography python-dnspython
  python-enum34 python-funcsigs python-idna python-ipaddress python-mock python-ndg-httpsclient python-openssl python-parsedatetime python-pbr
  python-pkg-resources python-psutil python-pyasn1 python-pyicu python-requests python-rfc3339 python-setuptools python-six python-tz python-urllib3
  python-zope.component python-zope.event python-zope.interface
0 aktualisiert, 31 neu installiert, 0 zu entfernen und 41 nicht aktualisiert.
Es müssen 2.130 kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 10,7 MB Plattenplatz zusätzlich benutzt.
Möchten Sie fortfahren? [J/n] j
…

Konfiguration anpassen

In der folgenden Konfigurationsdatei werden Standardeinstellungen vorgenommen, die sonst jedesmal beim Aufruf vom Certbot übergeben werden müssten. Vergiss nicht, die E-Mail-Adresse in dieser Konfigurationsdatei anzupassen. An diese E-Mail-Adresse werden Nachrichten versendet, falls es Probleme mit der Aktualisierung der Zertifikate gibt oder ein Zertifikat lange nicht aktualisiert wurde, da z.B. der Cronjob ausgefallen ist.

sudo vim /etc/letsencrypt/cli.ini
rsa-key-size = 2048
email = username@example.com
text = True
authenticator = webroot
webroot-path = /var/www/letsencrypt
staple-ocsp = True
agree-tos = True

Da nicht für jeden VHost ein neues Verzeichnis erstellt werden soll um die Zertifikate zu erstellen, wird hier ein gemeinsames Verzeichnis /var/www/letsencrypt für alle VHosts erstellt.

sudo mkdir /var/www/letsencrypt

nginx Konfigurieren

Um dieses Verzeichnis auch für mehrere VHosts verwenden zu können, erstellst du dir am besten ein Snippet für nginx, dass per include in die jeweilige Konfigurationsdatei eingebunden werden kann.

sudo vim /etc/nginx/snippets/letsencrypt.conf
location ~ ^/.well-known/acme-challenge {
    root /var/www/letsencrypt;
    default_type text/plain;
}

Standard VHost entfernen

Dieser VHost wird nicht mehr benötigt, da eine neue Konfigurationsdatei mit einem aussagekräftigen Namen erstellt wird.

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

Temporären VHost anlegen

Für die Erstellung des ersten Zertifikats wird ein einfacher VHost benötigt, der nichts weiter können muss als die Authentifizierung von Letsencrypt zu erledigen. Der Name des VHost (hier und in den weiteren Beispielen blar-test.spdns.de) muss natürlich wieder auf deinen Hostnamen geändert werden.

sudo vim /etc/nginx/sites-enabled/blar-test.spdns.de.conf
server {
    include "snippets/letsencrypt.conf";

    server_name blar-test.spdns.de;

    listen 80;
    listen [::]:80;

    root /var/www/html;
    index index.html;
    
    location / {
        try_files $uri $uri/ =404;
    }

}

nginx testen

Mit folgenden Befehl kann die Konfiguration von nginx getestet werden, ohne dass der Server neugestartet werden muss und dieser aufgrund eines kleinen Schreibfehlers nicht mehr erreichbar ist.

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Konfiguration von nginx neuladen

sudo systemctl reload nginx

Neues Zertifikat per Certbot

Als nächstes wird der Certbot gestartet um ein neues Zertifikat von Letsencrypt zu holen. Im Parameter domain wird der Domainname angegeben für den das Zertifikat erstellt werden soll. In der Ausgabe habe ich hervorgehoben unter welchen Pfad das neue Zertifikat gespeichert wird.

sudo certbot certonly --domain blar-test.spdns.de
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for blar-test.spdns.de
Using the webroot path /var/www/letsencrypt for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/blar-test.spdns.de/fullchain.pem. Your cert
   will expire on 2017-08-23. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

VHost für das Zertifikat anpassen

Der komplette alte Inhalt der Datei wird durch den neuen Inhalt ersetzt. Hier wird jetzt eine Umleitung von HTTP zu HTTPS hinzugefügt, falls der Besucher noch eine alte URL verwendet und die Einstellungen ssl_certificate für das Zertifikat und ssl_certificate_key für den Private-Key mit dem verschlüsselt wird hinzugefügt.

sudo vim /etc/nginx/sites-enabled/blar-test.spdns.de.conf
server {
    server_name blar-test.spdns.de;

    listen 80;
    listen [::]:80;

    rewrite ^ https://$server_name$request_uri? permanent;
}

server {
    include "snippets/letsencrypt.conf";

    server_name blar-test.spdns.de;

    listen 443 ssl;
    listen [::]:443 ssl;

    ssl_certificate /etc/letsencrypt/live/blar-test.spdns.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blar-test.spdns.de/privkey.pem;

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

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

Konfiguration von nginx neuladen

Jetzt wird noch einmal getestet ob die Konfigurationsdateien alle korrekt sind und danach kann die Konfiguration neugeladen werden.

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl reload nginx

HTTPS testen

Unter dem Hostnamen der im Artikel Externen Hostnamen per DDNS konfigurieren angelegt wurde, kann jetzt getestet werden ob HTTPS und auch die Umleitung von HTTP zu HTTPS funktioniert. Mit dem Schloss in der Adresszeile ist die sichere Verbindung zu deinem Raspberry PI für den Besucher sichtbar.

Https

Falls du noch weitere VHosts für deinen Raspberry PI anlegen möchtest, da du unterschiedliche Seiten bereitstellen willst, muss du nur die Schritte ab Temporären VHost anlegen wiederholen.

Kommentare sind geschlossen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.