Raspberry Pi SSL Zertifikat kostenlos mit Let’s Encrypt erstellen

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:

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 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):

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:

Raspberry Pi SSL Zertifikat von Let's Encrypt

 

Viele weitere Details finden sich außerdem in der offiziellen Let’s Encrypt Dokumentation.

18 Kommentare

  1. 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!

    Antworten
      • 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.

  2. „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.

    Antworten
      • 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.

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

    Antworten
    • 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

      Antworten
  4. 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?

    Antworten
  5. 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!

    Antworten
    • 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.

      Antworten
  6. 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?!?

    Antworten
    • 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

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

    Antworten
  8. 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

    Antworten
  9. 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.

    Antworten

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.

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

Blog abonnieren

Abonniere Raspberry Pi Tutorials, um kein Tutorial mehr zu verpassen!