Eine Verbindung per SSL/TLS schützt den Datenverkehr, indem Pakete verschlüsselt versendet werden. Um eine solche Verbindung aufbauen zu können, benötigt man ein Zertifikat eines vertrauenswürdigen Anbieters, welches meist über 20€ pro Jahr kostet. Dank der Let’s Encrypt Initiative gibt es nun solche SSL Zertifikate auch kostenlos für jedermann. Der große Vorteil besteht darin, dass der Zertifizierer in den gängigen Browsern als vertrauenswürdig eingestuft ist.
In diesem Artikel möchte ich zeigen, wie man für seine Node.JS / Apache Webserver u.ä. Anwendungen (FTP, etc.) ein Raspberry Pi SSL Zertifikat erstellen kann.
Vorbereitung
Um ein SSL / TLS Zertifikat auch sinnvoll nutzen zu können, sollte auf dem Raspberry Pi 3 ein Webserver bzw. eine Anwendung, zu welcher z.B. eine HTTP(S) Verbindung aufgebaut werden soll, laufen. Folgende Anwendungen habe ich bereits in vorherigen Tutorials gezeigt:
- Raspberry Pi Webserver Installation Teil 1 – Apache2
- Raspberry Pi Webserver Installation Teil 5 – FTP Server
- Raspberry Pi Node.js Webserver installieren und GPIOs schalten
Darüber hinaus empfehle ich unbedingt einen dynamischen DNS Server zu installieren, sofern dein Raspberry Pi keine statische IP Adresse hat. Normalerweise vergeben Internet Provider an Haushalte nur gegen Aufzahlung eine statische IP. Eine dynamische IP Adresse ändert sich spätestens einmal am Tag, d.h. es müsste eine andere IP Adresse abgerufen werden.
Mit einem dDNS Service kann dieses Problem umgangen werden, da eine Verbindung zu einem (kostenlosen) Domain aufgebaut wird, sobald sich die dynamische IP Adresse ändert. So kann man diese Domain anstelle der sich ändernden IP Adresse aufgerufen werden und der dDNS Service kümmert sich um alles weitere. Daneben kann deine richtige Domain (sofern du eine hast) auch per DNS Einträge auf diese „Zwischen-Domain“ zeigen.
Falls du einen Apache Server laufen lässt, kannst du diesen wie folgt beenden. Um einen Node.JS Server zu beenden, reicht es die Anwendung zu killen (ggf. Backgroundprozess beenden).
sudo service apache2 stop
Stelle außerdem sicher, dass neben Port 80 auch der Port 443 in deinem Router (Empfehlung: FRITZ!Box) für die interne IP Adresse des Raspberry Pi’s freigegeben ist.
Let’s Encrypt SSL Zertifikat erstellen
Um das Tool zum Erstellen des Zertifikats herunterzuladen, nutzen wir wir Git. Auf den neueren Raspbian Versionen ist dieses schon mit dabei. Falls es auf deinem Betriebssystem (z.B. einer Minimal Raspbian Version) nicht dabei sein sollte, kannst du es einfach nachinstallieren:
sudo apt-get install git
Wir laden die Dateien nun in unser Homeverzeichnis und gehen in diesen Ordner:
cd ~
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
Nun brauchst du alle Domains zur Hand, für welche dieses Zertifikat gelten soll. Wenn du bspw. Subdomains hast oder aber deine Domain mit und ohne „www“ aufgerufen wird, kannst du diese gleich alle angeben. In meinem Beispiel möchte ich das SSL Zertifikat lediglich für meine Domain, welche ich von NoIP bekommen habe, erstellen. Bei mehreren Domains solltest du die Hauptdomain als erstes angeben.
Der Befehl zum Erstellen des Let’s Encrypt Zertifikats ist folgender (Domains und Mail ersetzen):
./letsencrypt-auto -d ERSTE_DOMAIN -d ZWEITE_DOMAIN --redirect -m DEINE_MAIL
Der --redirect
Parameter gibt an, dass normale HTTP Verbindungen automatisch zu HTTPS weitergeleitet werden. Die Mail Adresse ist für eine eventuelle Kontaktaufnahme nötig bzw. falls das Zertifikat eines Tages widerhergestellt werden müsste.
Tipp: Solltest du einen Apache Server laufen lassen, kannst du das Tool auch alle weiteren Einstellungen vornehmen lassen, indem du den weiteren Parameter --apache
hinzufügst.
Du wirst nun aufgefordert die Nutzungsbedingungen zu lesen und zu akzeptieren.
Mit der Option certonly
kannst du außerdem angeben, dass lediglich die Zertifikate angelegt werden sollen. In dem Ordner „/etc/letsencrypt/live/“ befindet sich dann ein neuer Ordner mit dem Namen unserer angegeben Hauptdomain. Darin befinden sich vier Schlüsseldateien, welche gebraucht werden. Je nach Anwendung, ist der Einbau der SSL Zertifikate etwas anders. In Node.JS muss das Zertifikat z.B. per Code geladen werden. Wie die manuelle Einrichtung für Apache2 funktioniert, erfährst du hier.
Übrigens: Falls du Hilfe brauchst oder alle weiteren Parameters des Tools einsehen willst, kannst du dies einfach mittels ./letsencrypt-auto --help all
SSL Zertifikat erneuern
Alle Zertifikate von Let’s Encrypt haben eine Laufzeit von 3 Monaten. Nach dieser Periode sind sie abgelaufen und müssen erneuert werden. Das Erneuern des Raspberry Pi SSL Zertifikats ist allerdings sehr einfach (Anpassen nicht vergessen):
./letsencrypt-auto -d ERSTE_DOMAIN -d ZWEITE_DOMAIN --redirect -m DEINE_MAIL --agree-tos --renew-by-default
Hierbei ist der Parameter --renew-by-default
das Entscheidende. Die anderen (weiteren) Parameter sind identisch mit denen, die wir beim Erstellen angegeben haben.
Nun ist es allerdings so, dass man im Dauerbetrieb ja nicht unbedingt alle 3 Monate an die Aktualisierung des Zertifikats denken möchte. Daher bietet sich ein kleiner Trick an: Sollte der Raspberry Pi sowieso (fast) immer in Betrieb sein, können wir das Zertifikat auch früher aktualisieren, z.B. jeden Monat. Um dies automatisiert laufen zu lassen, nutzen wir Cron:
sudo crontab -e
Ans Ende dieser Datei fügen wir folgende Zeile hinzu (angepasst wie oben):
1 2 3 |
0 1 2 * * /home/pi/letsencrypt/letsencrypt-auto -d ERSTE_DOMAIN -d ZWEITE_DOMAIN --redirect -m DEINE_MAIL --agree-tos --renew-by-default |
Damit wird am 1. jeden Monats um 02:00 nachts das Tool gestartet und unser Raspberry Pi SSL Zertifikat erneuert.
Raspberry Pi SSL Zertifikat testen
Sofern der dynamische DNS Service läuft und dein Webserver wieder gestartet ist (sudo /etc/init.d/apache2 start
) kannst du nun im Browser testen, ob dein Zertifikat erkannt wurde. Dazu rufst du einfach die Domain mit https:// am Anfang auf. Speziell bei apache2 ist es wichtig, dass die Datei /etc/apache2/ports.conf
lediglich einen Eintrag hat, der Port 443 verwendet (alle anderen auskommentieren):
<IfModule mod_ssl.c> Listen 443 </IfModule>
Im Browser sollte nun das Zertifikat angezeigt werden:
Viele weitere Details finden sich außerdem in der offiziellen Let’s Encrypt Dokumentation.
29 Kommentare
Beste Website, die ich zu Raspberry und Co. finden konnte 😉
Super, dass es jetzt auch eine Anleitung zu SSL Zertifikaten gibt-auch wenn mit Let’s Encrypt und nicht selber erstellt (was ich persönlich auch ganz interessant fände).
Die (neue?) Ordnung der Website ist wesentlich übersichtlicher. Danke und weiter so!
Danke 🙂 Das Problem beim Selbst-Zertifizieren ist, dass dabei jeder Browser aufschreckt und eine Warnung anzeigt.
Inzwischen ist mir noch etwas aufgefallen; es ist nur eine Kleinigkeit, aber sicherheitshalber frage ich hier einmal nach:
Wenn das Script jeden Monat aufgerufen werden soll, müssten die Einträge in der Crontab nicht folgendermaßen aussehen?
m h DoM M Dow
0 2 1 * * […]
Also um 2:00 Uhr, am ersten Tag des Monats, jeden Monat, jeden Wochentag.
„Darüber hinaus empfehle ich unbedingt einen DNS Server zu installieren“
Im ganzen Artikel wird DDNS-Service mit DNS-Server verwechselt. Bitte auf keinen Fall einen DNS-Server installieren, wenn nötig einen „dynamischen DNS-Service“ wie dynDNS, no-ip,… verwenden.
Guter Einwand, ist angepasst 🙂
Wer eine Fritz!Box besitzt kann auch einfach direkt von AVM MyFRITZ! nutzen ist zu 100% Kostenlos nicht so wie No-IP das man alle 30 Tage erneut aktivieren darf sofern man es weiter nutzen möchte.
kann hier afraid.org emofählen
Vielen Dank, dein Tutorial funktioniert perfekt und hat mir eine Menge Zeit gespart! 🙂
Zwei kleine Anmerkungen zum Cronjob: So wie geschrieben wird der nicht an jedem 1. um 2.00 Uhr getriggert, sondern an jeden 2. um 1.00 Uhr – was aber völlig egal sein dürfte…
Und man sollte ggf. darauf hinweisen, dass falls man einen anderen User als den default „pi“ benutzt der Pfad für den cronjob entsprechend angepasst werden muss.
Hi Felix,
echt Klasse. Aber der link für die manuelle Einrichtung für Apache2 führt leider auf eine falsche Seite.
Hättest Du bitte den richtigen link. Danke
Inzwischen geht es noch einfacher, da es Debian Pakete für Lets encrypt/Certbot gibt (im Standard-Repository für Stretch und als Backport für Jessie):
Siehe
https://letsencrypt.org/ und
https://certbot.eff.org/
Für Debian/Raspbian Stretch:
https://certbot.eff.org/#debianstretch-apache
Großes Danke 😀
Was ist, wenn mein Raspberry von außen gar nicht erreichbar sein soll?
Nun ich greife via VPN auf mein Netzwerk zu. Der Raspberry hat hierzu natürlich eine statische IP.
Mein Raspberry soll dann z.B unter 192.XXX.XXX.X erreichbar sein.
Ist es nun möglich für die „Domain“ 192.XXX.XXX.X einen SSL-Schlüssel zu erstellen?
Oder soll ich lieber raspberry.fritz.box bei der Installation als Domain nehmen?
Nein, das wird nicht funktionieren. Du kannst dir aber ein selbst signiertes Zertifikat erstellen und den Public Key in den Truststore deines Browsers einfügen.
ich muss leider mal ganz dumm fragen:
wenn ich mein heimnetzwerk per vpn erreiche und dann auf mein Pi und Nextcloud zugreife, brauche ich dann noch eine ssl verschlüsselte verbindung?
Hallo, ich möchte letsencrypt mit meiner Nextcloud und no-ip verwenden. Der oben stehenden Anleitung bin ich zwar gefolgt, allerdings erhalte ich folgende Fehlermeldung:
Failed authorization procedure. mein-host.ddns.net (tls-sni-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Timeout
IMPORTANT NOTES:
– The following errors were reported by the server:
Domain: mein-host.ddns.net
Type: connection
Detail: Timeout
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address. Additionally, please check that
your computer has a publicly routable IP address and that no
firewalls are preventing the server from communicating with the
client. If you’re using the webroot plugin, you should also verify
that you are serving files from the webroot path you provided.
– Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
Wie beschrieben habe ich Apache zuerst gestoppt und später den Apache Parameter (–apache) hinzugefügt. Meine Nextcloud ist über mein-host.ddns.net bereits von außerhalb des lokalen Netzwerkes erreichbar. In meiner Router Software (A1 WLAN Box) hab eich unter “
„Gemeinsame Nutzung von Spielen und Anwendungen“ den Eintrag „HTTP Server (World Wide Web)“ für den Raspberry hinzugefügt.
Weiß jemand was ich falsch mache? Vielen Dank!
So, musste unter „Gemeinsame Nutzung von Spielen und Anwendungen“ auch „HTTPS Server“ für den Raspberry aktivieren. Dabei handelt es sich wohl um den erwähnten Port 443.
Ich bekomme immer den Fehler:
„IMPORTANT NOTES:
– The following errors were reported by the server:
Domain: subdomain.myfritz.net
Type: connection
Detail: Fetching
http://subdomain.myfritz.net/.well-known/acme-challenge/randomstuff:
Timeout
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address. Additionally, please check that
your computer has a publicly routable IP address and that no
firewalls are preventing the server from communicating with the
client. If you’re using the webroot plugin, you should also verify
that you are serving files from the webroot path you provided.“
Wie kann ich das beheben?!?
bei der Zertifizierung muss auch der http-Port durch die Fritzbox geöffnet sein. Danach kannst du ihn dicht machen. War bei mir das Problem.
Chris
Bei mir kommt, wenn ich das so ausführe folgender Fehler: (jemand eine Idee?)
Enabled Apache rewrite module
Waiting for verification…
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/000-default-le-ssl.conf
Enabled Apache socache_shmcb module
Error while running a2enmod ssl.
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Module socache_shmcb already enabled
ERROR: Config file ssl.conf not properly enabled: /etc/apache2/mods-enabled/ssl.conf is a real file, not touching it
Error while running a2enmod ssl.
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Module socache_shmcb already enabled
ERROR: Config file ssl.conf not properly enabled: /etc/apache2/mods-enabled/ssl.conf is a real file, not touching it
IMPORTANT NOTES:
– Unable to install the certificate
– Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/deadport.ddnss.de/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/deadport.ddnss.de/privkey.pem
Your cert will expire on 2018-11-15. To obtain a new or tweaked
version of this certificate in the future, simply run
letsencrypt-auto again with the „certonly“ option. To
non-interactively renew *all* of your certificates, run
„letsencrypt-auto renew“
– Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
Bei dem Vorgehen bekomme ich die „NXDOMAIN looking up A“ Fehlermeldung.
Waiting for verification…
Cleaning up challenges
Failed authorization procedure. http://www.meinhome.dnshome.de (http-01): urn:ietf:params:acme:error:dns :: DNS problem: NXDOMAIN looking up A for http://www.meinhome.dnshome.de
IMPORTANT NOTES:
– The following errors were reported by the server:
Domain: http://www.meinhome.dnshome.de
Type: None
Detail: DNS problem: NXDOMAIN looking up A for
http://www.meinhome.dnshome.de
Der Fehler hat wohl sehr viele Ursachen. Schlau bin ich aus den angebotenen Lösungen aber nicht geworden. Weiß jemand Rat?
Hallo,
vielen Dank für das Tutorial.
Ich habe Schwierigkeiten bei der Einbindung im Apache. Du schreibst: „Wie die manuelle Einrichtung für Apache2 funktioniert, erfährst du hier.“ Der Link führt dann zu einer Seite „Raspberry Pi: Überwachungskamera Livestream einrichten“. Die habe ich bereits gelesen, finde da aber nicht den entscheidenden Tipp. Kannst du mir bitte einen Hinweis geben, wie ich das hinbekomme? Vielen Dank.
VG nibbs
Moinsen ….
DANKE für die Anleitung …
Hier hat sich aber wohl der Fehlerteufel eingeschlichen!
Oben steht:
Wie die manuelle Einrichtung für Apache2 funktioniert, erfährst du hier.
Wenn ich da allerdings drauf klicke komme ich zu einer Anleitung für Webcam-Konfiguration.
PIP war veraltet, locales waren kaputt
Ich hatte ein selbst-zertifiziertes Zertifikat, und jeder Browser hat gemeckert – dank der Anleitung geschieht das jetzt nicht mehr. Alles hat funktioniert. Super Anleitung, danke!
Hallo vielen Dank für die Anleitung. Leider komme ich nicht weit. Nach diesem Befehl
./letsencrypt-auto -d ERSTE_DOMAIN -d ZWEITE_DOMAIN –redirect -m DEINE_MAIL
dauert es ca. 3 Minuten, dann spuckt das Terminal eine riesige Liste Fehler aus und „pip reports the following errors:…“ und unten steht dann „Certbot has problem setting up the virtual environment“
Was mache ich wohl falsch? Vielen Dank für die Hilfe.
@Phil: mir hat das hier weitergeholfen (nach ewigem gesuche…; gültig für die Raspbian-Version: Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.9 (stretch)
Release: 9.9
Codename: stretch
):
https://github.com/certbot/certbot/issues/6933#issuecomment-481668226
editiere die /etc/pip.conf (mit root-rechten) und kommentiere die Zeile „extra-index-url=https://www.piwheels.org/simple“ mit einem # am Zeilenanfang aus. Fertig.
ich habe das Zertifikat für meinen Raspi nach dieser Anleitung erstellt und es hat funktioniert. Anfang des Jahres das cert noch erneuert bevor es abläuft – auch das hat getan. aber eine weitere Erneuerung ist konstant auf die Nase geflogen und das ist ein Raspian-spezifisches Problem um das man sich selbst kümmern muss. nach einigem Googeln hab ich die Ursache gefunden. eine Lösung gibt’s hier: https://community.letsencrypt.org/t/certbot-auto-certificates-fails-while-installing-phyton-packages-with-these-packages-do-not-match-the-hashes/90363/6
Hallo,
bis jetzt hat alles funktioniert, jedoch führt der link zu der Konfiguration in apache2 auf eine falsche Seite…
Der hier beschriebene Weg um Zertifikate zu erhalten funktioniert nicht mehr. Seit 2020 ist das certbot-auto script deprecated, es wird empfohlen certbot per snap Paket zu installieren.
Quelle: https://community.letsencrypt.org/t/certbot-auto-deprecated-explanation-and-solutions/139821